And*_*lin 7 c# codedom system-codedom-compiler .net-standard-2.0
尝试编译此代码示例:
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());
Run Code Online (Sandbox Code Playgroud)
在.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选项,String []源)在CnetContent.Jobs.Dyn。 ctor(IEnumerable
1 referencedAssemblies, IEnumerable1 usings,String methodArgs,String codeSnippet)在CnetContent.Jobs.Core.JobBase.EvalRunCondition(String&错误)
我更新了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