点击上方 蓝字 江湖评谈 设为关注
在.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
往期精彩回顾