ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-05-16 10:02:29  阅读:412  来源: 互联网

标签:c net net-core roslyn


我正在开发一个针对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,net-core,roslyn
来源: https://codeday.me/bug/20190516/1115177.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有