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