c# – .NET Core上的Roslyn Scripting API:为什么编译器会抱怨“错误CS1501:WriteLine没有重载需要2个参数”?

我正在开发一个针对OSX的netcoreapp1.0项目,我正在使用Roslyn设置一个脚本,如下所示:

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();

Globals的位置是:

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确实有一个需要两种方法的重载.我简要地查看了CoreFx sources以查看是否有任何奇怪的类型转发或扩展方法技巧在脚本设置中可能需要额外的注意,但我没有看到任何异常(可能我错过了一些东西).

为什么Roslyn ScriptBuilder会抱怨这个?

最佳答案
在.NET Core中,Console类位于System.Console程序集中,因此您需要将其添加到脚本的引用中:

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

如果检查Object的程序集位置,您将看到它的System.Private.CoreLib.ni.dll.使用ILSpy,我们可以看到这个程序集只包含一个基本的Console实现,其方法是Write(string s),WriteLine(string s)和WriteLine().而System.Console程序集包含完整的实现.

转载注明原文:c# – .NET Core上的Roslyn Scripting API:为什么编译器会抱怨“错误CS1501:WriteLine没有重载需要2个参数”? - 代码日志