从Nuget安装
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
如果语法有错误,就会在下面的textbox显示编译错误
/// <summary> /// 多运行几次,就过100M内存了.不定期GC后也要占用50M /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRun_Click(object sender, EventArgs e) { txtErr.Text = ""; var text = txtScript.Text; var tree = SyntaxFactory.ParseSyntaxTree(text); var systemReference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); var compilation = CSharpCompilation.Create("calc.dll") .AddSyntaxTrees(tree) .AddReferences(systemReference) .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); Assembly compiledAssembly; //string outputPath = System.Windows.Forms.Application.StartupPath + "\\PlugIn\\" + "calc.dll"; //calc.dll保存在内存,没保存在文件 using (var stream = new MemoryStream()) { var compileResult = compilation.Emit(stream); //var compileResult = compilation.Emit(outputPath);//假如保存到c盘,需要权限 //用文件的话,再Emit的时候,会出现calc.dll”正由另一进程使用,因此该进程无法访问此文件。” if (!compileResult.Success) { foreach (var item in compilation.GetDiagnostics()) { txtErr.Text+= item.GetMessage() + Environment.NewLine; } MessageBox.Show("编译失败"); return; } compiledAssembly = Assembly.Load(stream.GetBuffer()); //compiledAssembly = Assembly.LoadFile(outputPath); } try { var calculatorClass = compiledAssembly.GetType("Calculator"); if(calculatorClass!=null) { var evaluateMethod = calculatorClass.GetMethod("Evaluate"); var result = evaluateMethod.Invoke(null, null).ToString(); Console.WriteLine(result); MessageBox.Show(result); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } //占用30M内存 private void btnSnippet_Click(object sender, EventArgs e) { try { var scriptState = CSharpScript.RunAsync<int>("if(DateTime.Now.Hour<12) return 13+2*5;else return 0;", ScriptOptions.Default.AddImports("System","System.IO")); MessageBox.Show(scriptState.Result.ReturnValue.ToString()); } catch (Exception ex) { MessageBox.Show(ex.Message); } }