加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

Roslyn还出现这么低级的错误,不应该呀!

发布时间:2020-12-16 09:05:22 所属栏目:asp.Net 来源:网络整理
导读:前几天对Dora.Interception作了简单的重构,想提供C#脚本来定义Interception Policy,毫无疑问微软提供的编译平台Roslyn使C#脚本化提供了支持。但是没有想到随便尝试了一个简单的功能就出现了问题,我个人觉得这应该是Roslyn的Bug。但是Roslyn经历了这么多次

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

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

<Project Sdk="Microsoft.NET.Sdk">
    PropertyGroup>
        OutputType>Exe</TargetFramework>netcoreapp2.1AssemblyName>AppRootNamespacePropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"LangVersion>7.3ItemGroupPackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="2.8.2" />
    >
Project>

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

namespace Scripting { public class Foo { } Bar { public Foo Foo { get; } public Bar(Foo foo) => Foo = foo; void Print() => Console.WriteLine(Foo); } 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());”这行代码按照如下的方式拆分成两行执行。

Program { [] args) { Fail CSharpScript .Create(var foo = new Foo();var bar = new Bar(foo);) .ContinueWith() .RunAsync(); } }

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

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

Unhandled Exception: Microsoft.CodeAnalysis.Scripting.CompilationErrorException: (1,19): error CS1503: Argument 1: cannot convert from 'Scripting.Foo [App,PublicKeyToken=null]' to Scripting.Foo [c:usersjinnanSourceReposAppAppbinDebugnetcoreapp2.1App.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) 89
   at Microsoft.CodeAnalysis.Scripting.Script`1.GetExecutor(CancellationToken cancellationToken) in /_/src/Scripting/Core/Script.3591.CommonGetExecutor(CancellationToken cancellationToken) 3431.TryGetPrecedingExecutors(Script lastExecutedScriptInChainOpt,CancellationToken cancellationToken) 4071.GetPrecedingExecutors(CancellationToken cancellationToken) 3701.RunAsync(Object globals,Func`2 catchException,1)">459
   at Scripting.Program.Main(String[] args) in c:usersjinnanSourceReposAppAppProgram.31
   at Scripting.Program.<Main>(String[] args)

这是我提交的issue链接:https://github.com/dotnet/roslyn/issues/28803#issuecomment-407894956

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读