2016-07-28 19 views
5

私はOSX上netcoreapp1.0をターゲットプロジェクトに取り組んでいる、と私はこのようロズリンを使用してスクリプトを設定してい:.NET上のRoslyn Scripting API:なぜコンパイラは「エラーCS1501:WriteLineのオーバーロードに2つの引数が必要ですか?

Globalsがある
var scriptText = File.ReadAllText(args[0]); 

var scriptOptions = ScriptOptions.Default 
    .WithReferences(
     typeof(System.Object).GetTypeInfo().Assembly 
    ); 

var script = CSharpScript.Create(scriptText, scriptOptions, typeof(Globals)); 

var scriptArgs = new string[args.Length-1]; 
Array.Copy(args, 1, scriptArgs, 0, args.Length-1); 

script.RunAsync(new Globals 
{ 
    Args = scriptArgs 
}) 
.GetAwaiter().GetResult(); 

public class Globals 
{ 
    public string[] Args { get; set; } 
} 

私が実行しようとするとこのようになりますスクリプト:

using System; 

Console.WriteLine("Args[0]: {0}", Args[0]); 

プログラムはこの例外で終了:

$ dotnet run test.csx 
Project BitThicket.DotNet.ScriptTool (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation. 
Script error: Microsoft.CodeAnalysis.Scripting.CompilationErrorException: (7,9): error CS1501: No overload for method 'WriteLine' takes 2 arguments 
    at Microsoft.CodeAnalysis.Scripting.ScriptBuilder.ThrowIfAnyCompilationErrors(DiagnosticBag diagnostics, DiagnosticFormatter formatter) 
    at Microsoft.CodeAnalysis.Scripting.ScriptBuilder.CreateExecutor[T](ScriptCompiler compiler, Compilation compilation, CancellationToken cancellationToken) 
    at Microsoft.CodeAnalysis.Scripting.Script`1.GetExecutor(CancellationToken cancellationToken) 
    at Microsoft.CodeAnalysis.Scripting.Script`1.RunAsync(Object globals, Func`2 catchException, CancellationToken cancellationToken) 
    at BitThicket.DotNet.ScriptTool.Program.Main(String[] args) in /Users/ben/proj/bt/dotnet-scriptcs/src/BitThicket.DotNet.ScriptTool/Program.cs:line 63 

明らかにConsoleは、実際には2つの方法をとるオーバーロードを持っています。私はCoreFx sourcesを少し見て、スクリプト設定で追加の注意が必要かもしれない奇妙なタイプフォワーディングまたは拡張メソッドのトリックがあるかどうかを確認しましたが、何か珍しいことはありませんでした。

なぜRoslyn ScriptBuilderがこれに不満を持ちますか? .NETのコア、Consoleクラスで

+0

新しい書式設定を使用するとどうなりますか? 'Console.WriteLine($" Args [0]:{Args [0]} ");' – PhillipXT

+0

提案のおかげで@PhillipXT。これは文字列補間構文で動作しますが、根本的な問題よりもはるかに優れています。実際には、このスクリプトは単にConsole.WriteLine以上の機能を果たしますが、アセンブリ参照に関連するいくつかのエラーが発生しています。実際の問題をここで理解しておけば、他の問題の解決にも役立ちます。 –

+1

ちょうどArgs [0]が何とか問題ではないことを確認して確認したかったのです。 WriteLineで何が間違っているのか分かりません... – PhillipXT

答えて

6

System.Consoleアセンブリであるので、あなたは、スクリプトの参照にそれを追加する必要があります:

var scriptOptions = ScriptOptions.Default 
    .WithReferences(
     typeof(System.Object).GetTypeInfo().Assembly, 
     typeof(System.Console).GetTypeInfo().Assembly 
    ); 

あなたがObjectの組立位置を確認する場合は、'LL System.Private.CoreLib.ni.dllを参照してください。 ILSpyを使用すると、このアセンブリには、基本的なConsole実装のみが含まれ、方法はWrite(string s),およびWriteLine()であることがわかります。 System.Consoleアセンブリには完全な実装が含まれています。

+0

私は現時点では試してみませんか?これが当てはまると、私の例では 'Console'タイプを見つけるのにコンパイラが失敗するのはなぜですか? –

+0

@BenCollinsそうです、それは奇妙です。しかし、アセンブリを追加すると、私はチェックしました。 –

+1

@BenCollins私は解説を更新しました。 –

関連する問題