博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Roslyn还出现这么低级的错误,不应该呀!
阅读量:7088 次
发布时间:2019-06-28

本文共 3627 字,大约阅读时间需要 12 分钟。

前几天对作了简单的重构,想提供C#脚本来定义Interception Policy,毫无疑问微软提供的编译平台Roslyn使C#脚本化提供了支持。但是没有想到随便尝试了一个简单的功能就出现了问题,我个人觉得这应该是Roslyn的Bug。但是Roslyn经历了这么多次版本的迭代还出现如此低级的错误,实在有点说不过去。

闲话少说,我们现在通过几行简单的代码来重现这个Bug。我们创建了一个.NET Core 2.1的控制台应用,并添加针对NuGet包”Microsoft.CodeAnalysis.CSharp.Scripting“(版本2.8.2)的依赖。如下所示的是.csproj的完整定义。

Exe
netcoreapp2.1
App
App
7.3

接下来我们编写了一段简单的程序。如下面的代码片段所示,我们只是采用脚本的形式创建了一个Foo对象并利用它创建出Bar对象,然后调用后者的Print方法而已。

namespace Scripting{    public class Foo { }    public class Bar    {        public Foo Foo { get; }        public Bar(Foo foo) => Foo = foo;        public void Print() => Console.WriteLine(Foo);    }    class Program    {        static async Task Main(string[] args)        {            var options = ScriptOptions.Default                .AddReferences(typeof(Program).Assembly)                .AddImports("Scripting");            //Success            await CSharpScript               .Create("var bar = new Bar(new Foo());", options)               .ContinueWith("bar.Print()")               .RunAsync();        }    }}

这段代码是没有问题的,运行之后Print方法输出的结果可以正常出现在入下所示的控制台上。

接下来我们将“var bar = new Bar(new Foo());”这行代码按照如下的方式拆分成两行执行。

class Program{    static async Task Main(string[] args)    {        //Fail        await CSharpScript            .Create("var foo = new Foo();", options)            .ContinueWith("var bar = new Bar(foo);")            .ContinueWith("bar.Print()")            .RunAsync();    }}

在此运行该程序后出现如下所示的“Microsoft.CodeAnalysis.Scripting.CompilationErrorException”异常,并提示“cannot convert from 'Scripting.Foo [App, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]' to 'Scripting.Foo [c:\users\jinnan\Source\Repos\App\App\bin\Debug\netcoreapp2.1\App.dll]”。

如下所示的是完整的错误信息:

Unhandled Exception: Microsoft.CodeAnalysis.Scripting.CompilationErrorException: (1,19): error CS1503: Argument 1: cannot convert from 'Scripting.Foo [App, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]' to 'Scripting.Foo [c:\users\jinnan\Source\Repos\App\App\bin\Debug\netcoreapp2.1\App.dll]'   at Microsoft.CodeAnalysis.Scripting.ScriptBuilder.ThrowIfAnyCompilationErrors(DiagnosticBag diagnostics, DiagnosticFormatter formatter) in /_/src/Scripting/Core/ScriptBuilder.cs:line 104   at Microsoft.CodeAnalysis.Scripting.ScriptBuilder.CreateExecutor[T](ScriptCompiler compiler, Compilation compilation, Boolean emitDebugInformation, CancellationToken cancellationToken) in /_/src/Scripting/Core/ScriptBuilder.cs:line 89   at Microsoft.CodeAnalysis.Scripting.Script`1.GetExecutor(CancellationToken cancellationToken) in /_/src/Scripting/Core/Script.cs:line 359   at Microsoft.CodeAnalysis.Scripting.Script`1.CommonGetExecutor(CancellationToken cancellationToken) in /_/src/Scripting/Core/Script.cs:line 343   at Microsoft.CodeAnalysis.Scripting.Script`1.TryGetPrecedingExecutors(Script lastExecutedScriptInChainOpt, CancellationToken cancellationToken) in /_/src/Scripting/Core/Script.cs:line 407   at Microsoft.CodeAnalysis.Scripting.Script`1.GetPrecedingExecutors(CancellationToken cancellationToken) in /_/src/Scripting/Core/Script.cs:line 370   at Microsoft.CodeAnalysis.Scripting.Script`1.RunAsync(Object globals, Func`2 catchException, CancellationToken cancellationToken) in /_/src/Scripting/Core/Script.cs:line 459   at Scripting.Program.Main(String[] args) in c:\users\jinnan\Source\Repos\App\App\Program.cs:line 31   at Scripting.Program.
(String[] args)

这是我提交的issue链接:

转载地址:http://zyfql.baihongyu.com/

你可能感兴趣的文章
GPU编程(二): GPU架构了解一下!
查看>>
HBase核心知识点总结
查看>>
Django RESTFramework——更新数据 (5)
查看>>
iOS目录解析 彻底搞懂iOS App的目录结构
查看>>
深入浅出JDK动态代理(二)
查看>>
前端实现获取浏览器flash版本号
查看>>
Hybrid小技巧:通过js调用原生对话框(Android)
查看>>
日志服务Python消费组实战(二):实时分发数据
查看>>
从几道面试题看对象的初始化
查看>>
盛极而衰,互联网体育是伪风口还是真趋势?
查看>>
14-《ARKit by Tutorials》读书笔记1:开始入门
查看>>
[MetalKit]33-Ambient-Occlusion-in-Metal环境光遮蔽
查看>>
图解JavaScript算法排序
查看>>
Flask环境搭建(自己学习用)
查看>>
iOS逆向之旅(进阶篇) — HOOK(Method Swizzling)
查看>>
Javascript之正则表达式的学习笔记
查看>>
Hadoop 学习系列(三)之 YARN 详细解析
查看>>
QPM 之悬浮窗助力性能优化
查看>>
YYCache 源码学习(一):YYMemoryCache
查看>>
ios 原生骨架动画库
查看>>