阅读量:0
在C#中,可以使用System.CodeDom命名空间和System.Reflection命名空间来动态编译Assembly。
下面是一个简单的示例代码,演示了如何动态编译一个包含一个简单类的Assembly:
using System; using System.CodeDom.Compiler; using System.Reflection; using Microsoft.CSharp; class Program { static void Main() { // 创建一个编译器实例 CSharpCodeProvider provider = new CSharpCodeProvider(); // 设置编译参数 CompilerParameters parameters = new CompilerParameters(); parameters.GenerateExecutable = false; parameters.GenerateInMemory = true; // 定义要编译的代码 string sourceCode = @" using System; namespace DynamicAssembly { public class DynamicClass { public void PrintMessage() { Console.WriteLine(""Hello, dynamic assembly!""); } } } "; // 编译代码 CompilerResults results = provider.CompileAssemblyFromSource(parameters, sourceCode); // 获取编译后的Assembly Assembly assembly = results.CompiledAssembly; // 创建一个实例 Type dynamicType = assembly.GetType("DynamicAssembly.DynamicClass"); dynamic instance = Activator.CreateInstance(dynamicType); // 调用动态类的方法 dynamicType.GetMethod("PrintMessage").Invoke(instance, null); } }
在这个示例中,我们使用CSharpCodeProvider来创建一个编译器实例,然后设置编译参数和要编译的代码。接下来,我们调用CompileAssemblyFromSource方法来编译代码,并从CompilerResults中获取编译后的Assembly。最后,我们使用Activator.CreateInstance来创建动态类的实例,并调用其中的方法。
通过这种方式,我们可以在运行时动态编译代码,并使用生成的Assembly中的类。