当前位置: 欣欣网 > 码农

.NET9新功能--保存反射程序集

2024-02-18码农

点击上方 蓝字 江湖评谈 设为关注




在.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

往期精彩回顾