我正在开发一个针对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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。