using System; using Microsoft.CSharp; using System.CodeDom.Compiler; using System.Reflection; using System.IO; using System.Text; namespace TestConsoleApplication { /// <summary> /// 动态类的接口 /// </summary> public interface IDynamicClass { int ExecuteCode(); } class Program { const string DYNAMICCLASSNAMECSPACE = "TestConsoleApplication"; // 动态类命名空间 这里为了方便简单操作,把类跟接口放在了同一个命名空间 const string DYNAMICCLASSNAME = "MyDynamicClass"; // 动态类名称 static void Main(string[] args) { string classCode = GetCSharpCode(); // 获取类字符串 // 创建编译器实例 CSharpCodeProvider provider = new CSharpCodeProvider(); // 设置编译参数 CompilerParameters paras = new CompilerParameters(); paras.ReferencedAssemblies.Add(Path.GetFileName(Assembly.GetExecutingAssembly().CodeBase)); // 为动态程序集添加当前函数库的调用 paras.ReferencedAssemblies.Add("System.dll"); 添加其它程序集调用 //paras.ReferencedAssemblies.Add("SvHoo.IDAL.dll"); //paras.ReferencedAssemblies.Add("SvHoo.DAL.dll"); paras.GenerateExecutable = false; paras.GenerateInMemory = true; // 编译代码生成程序集 CompilerResults result = provider.CompileAssemblyFromSource(paras, classCode); if (!result.Errors.HasErrors) { // 获取生成的程序集 Assembly assembly = result.CompiledAssembly; // 获取动态类对象,并调用 IDynamicClass idy = assembly.CreateInstance(DYNAMICCLASSNAMECSPACE + "." + DYNAMICCLASSNAME) as IDynamicClass; Console.WriteLine("返回值:" + idy.ExecuteCode()); } else { // 错误处理 string errormsg = string.Empty; foreach (CompilerError error in result.Errors) { errormsg += error.ErrorText; } Console.Write(errormsg); } } // 创建动态类代码 private static string GetCSharpCode() { StringBuilder classCode = new StringBuilder(); classCode.Append("using System;"); classCode.Append("namespace " + DYNAMICCLASSNAMECSPACE); // classCode.Append("{"); classCode.Append(" public class " + DYNAMICCLASSNAME + " : IDynamicClass"); // 继承外部接口 classCode.Append(" {"); classCode.Append(" public int ExecuteCode()"); classCode.Append(" {"); classCode.Append(" Console.WriteLine();"); classCode.Append(" Console.WriteLine(/"This my new dynamic class/");"); classCode.Append(" Console.WriteLine();"); classCode.Append(" return 999999;"); classCode.Append(" }"); classCode.Append(" }"); classCode.Append("}"); return classCode.ToString(); } } }