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

时间:2018-04-04 15:55:56

标签: 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:此平台不支持此操作。      在Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options,String [] fileNames)      在Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options,String [] sources)      在CnetContent.Jobs.DynamicCode..ctor(IEnumerable 1 referencedAssemblies, IEnumerable 1个使用,String methodArgs,String codeSnippet)      在CnetContent.Jobs.Core.JobBase.EvalRunCondition(String& error)

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

2 个答案:

答案 0 :(得分:4)

.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

答案 1 :(得分:2)

就我而言,我正在将一个项目从 .NET Framework 4.7.2 迁移到 .NET Standard 2.0。在这个项目中,我有代码在运行时使用 CSharpCodeProvider 生成程序集。可以编译项目,但在运行时我的代码在从 Dom 生成程序集时抛出异常。我收到此错误:

CS0012: The type 'System.Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.

因此,程序集不是在运行时创建的。

为了解决这个问题,我为编译器添加了 .netstandard 作为这样的引用程序集:

var compilerParameters = new CompilerParameters();
var netstandard = Assembly.Load("netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51");
compilerParameters.ReferencedAssemblies.Add(netstandard.Location);

这对我有用。