日期:2014-05-20 浏览次数:21087 次
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Model { public class UserInfo { public virtual int ID { get; set; } public virtual string UserID { get; set; } public virtual string UserName { get; set; } } }
using Microsoft.CSharp; using System.CodeDom.Compiler; using System.IO; CSharpCodeProvider objCSharpCodePrivoder=new CSharpCodeProvider(); CompilerParameters paras = new CompilerParameters(); paras.GenerateExecutable = false; //编译成exe还是dll //paras.ReferencedAssemblies.Add("System.dll"); paras.GenerateInMemory = false; //是否写入内存,不写入内存就写入磁盘 paras.OutputAssembly = "C:\\UserInfo.dll"; //输出路径 StreamReader sr = new StreamReader(@"C:\UserInfo.cs"); String txtStr = sr.ReadToEnd(); CompilerResults result = objCSharpCodePrivoder.CompileAssemblyFromSource(paras, txtStr);
using System.Reflection; using System.Globalization; using Microsoft.CSharp; using System.CodeDom; using System.CodeDom.Compiler; private string CreateCode() { StringBuilder sb = new StringBuilder(); //声明需要使用的命名空间。 sb.Append("using System;"); sb.Append("using System.Collections.Generic;"); sb.Append("using System.ComponentModel;"); sb.Append("using System.Data;"); sb.Append("using System.Drawing;"); sb.Append("using System.Text;"); sb.Append("using System.Windows.Forms;"); sb.Append(Environment.NewLine); //将需要执行的功能this.code,字符串包装到一个类的函数里面。 sb.Append("namespace DynamicCodeGenerate"); sb.Append(Environment.NewLine); sb.Append("{"); sb.Append(Environment.NewLine); sb.Append(" public class HelloWorld"); sb.Append(Environment.NewLine); sb.Append(" {"); sb.Append(Environment.NewLine); sb.Append(" public void OutPut()"); sb.Append(Environment.NewLine); sb.Append(" {"); sb.Append(Environment.NewLine); sb.Append(this.code); sb.Append(Environment.NewLine); sb.Append(" }"); sb.Append(Environment.NewLine); sb.Append(" }"); sb.Append(Environment.NewLine); sb.Append("}"); //将所有声明的字符串返回给编译器使用。 string code = sb.ToString(); return code; } private void btnRun_Click(object sender, EventArgs e) { CodeDomProvider _CodeDomProvider = CodeDomProvider.CreateProvider("CSharp"); //提供对 C# 代码生成器和代码编译器的实例的访问 //CSharpCodeProvider _CSharpCodePrivoder = new CSharpCodeProvider(); //定义用于调用源代码编译的接口或使用指定编译器的 CodeDOM 树 //ICodeCompiler _ICodeCompiler = _CodeDomProvider.CreateCompiler(); //_CSharpCodePrivoder.CreateCompiler(); //表示用于调用编译器的参数,将所有需要使用的DLL和EXE文件添加打参数里面。 CompilerParameters _CompilerParameters = new CompilerParameters(); _CompilerParameters.ReferencedAssemblies.Add("System.dll"); _CompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll"); _CompilerParameters.ReferencedAssemblies.Add("CodeDom.exe"); _CompilerParameters.ReferencedAssemblies.Add("System.Data.dll"); _CompilerParameters.ReferencedAssemblies.Add("System.Drawing.dll"); _CompilerParameters.GenerateExecutable = false; _CompilerParameters.GenerateInMemory = true; //表示从编译器返回的编译结果 //CompilerResults _CompilerResults = _ICodeCompiler.CompileAssemblyFromSource(_CompilerParameters, this.CreateCode()); //在CodeDomProvider 类中已经实现了ICodeCompiler类中的CompileAssemblyFromSource()方法,直接调用就可以了! CompilerResults _CompilerResults =_CodeDomProvider.CompileAssemblyFromSource(_CompilerParameters, this.CreateCode()); if (_CompilerResults.Errors.HasErrors) { string ErrorMessage=""; foreach (CompilerError err in _CompilerResults.Errors) { ErrorMessage += err.ErrorText; } MessageBox.Show(ErrorMessage); } else { // 通过反射,调用HelloWorld的实例 Assembly _Assembly = _CompilerResults.CompiledAssembly; //CreateInstance()从此程序集中查找某个类型,然后使用系统激活器创建它的实例 object _HelloWorld = _Assembly.CreateInstance("DynamicCodeGenerate.HelloWorld"); //发现方法的属性并提供对方法元数据的访问,获取OutPut()方法。 MethodInfo _MethodInfo = _HelloWorld.GetType().GetMethod("OutPut"); //执行objMI对象中的objHelloWorld对象中的函数。 _MethodInfo.Invoke(_HelloWorld, null); } }