點選上方 藍字 江湖評談 設為關註
在.NET5-8版本中,一般透過AssemblyBuilder來生成程式集和為動態建立的型別反射後設資料,但是缺乏對保存程式集的支持,現在.NET9添加了新的API透過AssemblyBuilder實作了程式集的保存功能。
現有的API是DefineDynamicAssembly API,新的API則是DefinePersistedAssembly,因為新的API的持久化與執行時和平台無關,就目前而言,持久化實作僅支持保存,不支持執行。建立持久化的例項後,用於定義模組、型別、方法或列舉、編寫 IL 以及所有其他用法的後續步驟保持不變。這意味著您可以按原樣使用現有的 System.Reflection.Emit 程式碼來保存程式集。
下面的程式碼顯示了一個範例。它的使用程式碼可以如下所示:
publicvoidCreateAndSaveAssembly(string assemblyPath)
{
AssemblyBuilder ab = AssemblyBuilder.DefinePersistedAssembly(
new AssemblyName("MyAssembly"),
typeof(object).Assembly
);
TypeBuilder tb = ab.DefineDynamicModule("MyModule")
.DefineType("MyType", TypeAttributes.Public | TypeAttributes. class);
MethodBuilder mb = tb.DefineMethod(
"SumMethod",
MethodAttributes.Public | MethodAttributes.Static,
typeof(int), [typeof(int), typeof(int)]
);
ILGenerator il = mb.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Add);
il.Emit(OpCodes.Ret);
tb.CreateType();
ab.Save(assemblyPath); // or could save to a Stream
}
publicvoidUseAssembly(string assemblyPath)
{
Assembly assembly = Assembly.LoadFrom(assemblyPath);
Type type = assembly.GetType("MyType");
MethodInfo method = type.GetMethod("SumMethod");
Console.WriteLine(method.Invoke(null, [5, 10]));
}
這種功能的實用性關鍵看計畫裏面的使用情況而定。
原文: https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-9/overview
往期精彩回顧