使用codedom 编写脚本解释器
本篇博客的目的是为了保存例子,怕自己忘记。
1 private void dd(string code) 2 { 3 string path = "BonkerSpace"; 4 if (File.Exists(path)) 5 { 6 File.Delete(path); 7 } 8 // 创建编译器对象 9 Microsoft.CSharp.CSharpCodeProvider p = new Microsoft.CSharp.CSharpCodeProvider(); 10 //new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } }); 11 12 // 设置编译参数 13 System.CodeDom.Compiler.CompilerParameters options = new System.CodeDom.Compiler.CompilerParameters(); 14 options.ReferencedAssemblies.Add("System.dll"); 15 options.ReferencedAssemblies.Add("System.Data.dll"); 16 options.ReferencedAssemblies.Add("System.Xml.dll"); 17 options.ReferencedAssemblies.Add("mscorlib.dll"); 18 options.GenerateInMemory = true; 19 options.OutputAssembly = "BonkerSpace"; 20 21 // 开始编译 22 System.CodeDom.CodeSnippetCompileUnit cu = new System.CodeDom.CodeSnippetCompileUnit(code); 23 System.CodeDom.Compiler.CompilerResults cr = p.CompileAssemblyFromDom(options, cu); 24 25 // 执行动态程序集相关内容。 26 Type t = cr.CompiledAssembly.GetType("BonkerSpace.BonkerClass"); 27 object o = cr.CompiledAssembly.CreateInstance("BonkerSpace.BonkerClass"); 28 object result = t.InvokeMember("Bonker", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod, null, o, null); 29 30 this.richTextBox2.Text = result.ToString(); 31 }
这个方法是codedome的解释类。code参数是代码,注意此代码是完整的c#代码
例如你可以这样使用
1 private void button1_Click(object sender, EventArgs e) 2 { 3 try 4 { 5 6 string msg = string.Format(@" 7 using System; 8 using System.Collections.Generic; 9 // using System.ComponentModel; 10 using System.Data; 11 // using System.Drawing; 12 // using System.Linq; 13 //using System.Text; 14 // using System.Windows.Forms; 15 namespace BonkerSpace 16 {{ 17 public class BonkerClass 18 {{ 19 public object Bonker() 20 {{ 21 {0} 22 }} 23 }} 24 }}", this.richTextBox1.Text); 25 dd(msg); 26 } 27 catch (Exception ex) 28 { 29 MessageBox.Show(ex.Message); 30 } 31 32 }
这样就可以了。
作者:Bonker 出处:http://www.cnblogs.com/Bonker WeiXin:iBonker |