在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中的类。