.NET 5及以上版本如何创建动态程序集并保存到磁盘?
.NET 5及以上版本创建并保存动态程序集到磁盘的方案
在.NET 5、6、7等后续版本中,AssemblyBuilderAccess.RunAndSave枚举值被移除,无法再通过旧版方式直接创建可运行并保存的动态程序集。这一变更主要是为了适配跨平台架构——旧实现深度依赖Windows特定逻辑,无法在Linux、macOS等平台正常工作。
以下是两种可行的替代方案:
一、使用System.Reflection.Emit的模块保存方式
这是官方推荐的替代方案,通过定义带保存路径的动态模块来实现程序集持久化:
using System; using System.Reflection; using System.Reflection.Emit; // 1. 定义程序集名称 var assemblyName = new AssemblyName("DynamicAssembly"); // 2. 创建动态程序集,指定运行权限 var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); // 3. 定义动态模块,同时指定要保存的目标文件路径 var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, "DynamicAssembly.dll"); // 4. 示例:在模块中定义一个简单的公开类型 var typeBuilder = moduleBuilder.DefineType("DynamicType", TypeAttributes.Public); // 5. 给类型添加一个静态方法 var methodBuilder = typeBuilder.DefineMethod( "PrintHello", MethodAttributes.Public | MethodAttributes.Static, typeof(void), Type.EmptyTypes ); var ilGenerator = methodBuilder.GetILGenerator(); ilGenerator.EmitWriteLine("Hello from dynamically saved assembly!"); ilGenerator.Emit(OpCodes.Ret); // 6. 完成类型定义 typeBuilder.CreateType(); // 7. 将模块(及关联程序集)保存到磁盘 moduleBuilder.Save("DynamicAssembly.dll");
执行上述代码后,会在当前目录生成DynamicAssembly.dll文件,这个程序集可以被其他.NET应用正常加载和调用。
二、底层元数据生成方案(适合高级场景)
如果需要更精细的控制程序集结构,可以使用System.Reflection.Metadata和System.Reflection.Metadata.Ecma335库手动生成程序集元数据和IL代码。这种方式复杂度更高,但能实现更定制化的程序集生成逻辑,适合对程序集结构有特殊要求的场景。
内容的提问来源于stack exchange,提问作者g.pickardou
相关产品推荐
相关产品推荐

