Попытка скомпилировать этот образец кода:
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, имена файлов String[]) в Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(параметры CompilerParameters, источники String[]) в CnetContent.Jobs.DynamicCode.. ctor (использования IEnumerable
1 referencedAssemblies, IEnumerable
1, String methodArgs, String codeSnippet) в CnetContent.Jobs.Core.JobBase.EvalRunCondition (строка и ошибка)
Я обновил System.CodeDom, и эта библиотека поддерживает .netstandard 2.0, но этот код по-прежнему не работает. Не удалось найти ни одного случая с похожими проблемами. Любые идеи? Заранее спасибо!
CSharpCodeGenerator
используется для жутких вещей, таких как использование локально установленного компилятора C#, что-то, что не особенно переносимо (или надежно). - person Jeroen Mostert   schedule 04.04.2018