當前位置: 妍妍網 > 碼農

.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

往期精彩回顧