通过微软提供的CSharpCodeProvider,CompilerParameters,CompilerResults等类,可以在运行时,动态执行自己写的代码文件。原理就是把你的代码文件动态编译成exe或dll,或者在内存中输出,然后通过Assembly进行反射,执行其中的方法或访问其中的属性等。
界面有两个按钮,一个执行ShowMessage方法,另一个执行ShowForm方法,代码如下
需引入
using Microsoft.CSharp; using System.CodeDom; using System.CodeDom.Compiler; using System.Reflection;
private void button2_Click(object sender, EventArgs e) { CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider(); CompilerParameters objCompilerParameters = new CompilerParameters(); objCompilerParameters.ReferencedAssemblies.Add("System.dll"); objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); objCompilerParameters.GenerateExecutable = false; objCompilerParameters.GenerateInMemory = true; CompilerResults cresult = objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters, textBox2.Text); if (cresult.Errors.HasErrors) { foreach (CompilerError err in cresult.Errors) { MessageBox.Show(err.ErrorText); } } else { // 通过反射,执行代码 Assembly objAssembly = cresult.CompiledAssembly; object obj = objAssembly.CreateInstance("CodeTest.Test"); MethodInfo objMI = obj.GetType().GetMethod("ShowMessage"); objMI.Invoke(obj, new object[]{"This is CodeTest!"}); } }因为自定义代码中有
using System;
using System.Windows.Forms;
需要上面两个类库才能执行,所以要在CompilerParameters中对这两个dll添加引用,既
objCompilerParameters.ReferencedAssemblies.Add("System.dll"); objCompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");