c# - 在 .netstandard 2.0 上迁移后无法编译简单的动态代码(CodeDom 抛出 System.PlatformNotSupportedException)

标签 c# codedom .net-standard-2.0 system-codedom-compiler

尝试编译这段代码示例:

var c = new CSharpCodeProvider();
var cp = new CompilerParameters();
var className = $"CodeEvaler_{Guid.NewGuid().ToString("N")}";
// doesn't work with or without netstandard reference
var netstandard = Assembly.Load("netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51");
cp.ReferencedAssemblies.Add(netstandard.Location);
cp.CompilerOptions = "/t:library";
cp.GenerateInMemory = true;

var sb = new StringBuilder("");

sb.Append("namespace Jobs.Dynamic{ \n");
sb.Append($"public class {className} {{\n");
sb.Append($"public object RunSnippetCode()\n{{\n");
sb.Append("\nreturn null;\n");
sb.Append("\n}\n");
sb.Append("}");
sb.Append("}");

CompilerResults cr = c.CompileAssemblyFromSource(cp, sb.ToString());

迁移到 .netstandard 2.0 之前一切正常

必须生成一个简单的类,只需复制代码并在 Visual Studio 中运行它即可。具有一个返回 null 的方法的类。 现在 CompileAssemblyFromSource 方法抛出

System.PlatformNotSupportedException: Operation is not supported on this platform. at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames) at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources) at CnetContent.Jobs.DynamicCode..ctor(IEnumerable1 referencedAssemblies, IEnumerable1 usings, String methodArgs, String codeSnippet) at CnetContent.Jobs.Core.JobBase.EvalRunCondition(String& error)

我更新了 System.CodeDom 并且这个库支持 .netstandard 2.0,但是这段代码仍然不起作用。 找不到任何有类似问题的案例。 有任何想法吗? 提前致谢!

最佳答案

我在使用 .NetCore 2 时遇到了同样的问题,但使用的是更大的 CodeDOM 项目。我现在正在构建的解决方案是从 CodeDom 生成源代码,然后将其传递给 Roslyn。 (正如评论中提到的 Roslyn,但只发布了 .NET Framwork 解决方案)

这是一个如何使用 Roslyn 的好例子 - 只需添加

Microsoft.CodeAnalysis.CSharp NuGet 包 和 System.Runtime.Loader NuGet 包

然后使用这里的代码(或者只是按照示例): https://github.com/joelmartinez/dotnet-core-roslyn-sample/blob/master/Program.cs

关于c# - 在 .netstandard 2.0 上迁移后无法编译简单的动态代码(CodeDom 抛出 System.PlatformNotSupportedException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49655478/

相关文章:

c# - 处理 DynamicObject 缺失成员的首选方法是什么?

javascript - 从字符串末尾匹配多个实例

c# - 如何在 VBCodeProvider 中启用隐式续行?

c# - 无法为 .Net 标准库 (System.Text.Json) 加载程序集

compiler-errors - 如何解决 “The type or namespace name ' Didstopia'找不到(您是否缺少using指令或程序集引用?)”

c# - 调用方法时结构体值不会改变

c# - 作为属性的接口(interface)

c# - 将 C# 6 功能与 CodeDomProvider (Roslyn) 结合使用

c# - CodeDom 如何创建具有 void 返回类型的方法?

c# - 在 .netstandard 2 中使用哪个 HttpRequest 类?