You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:45:11