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

.NET Core中如何将现有程序集的方法复制到动态程序集?

问题:将现有程序集的方法复制到动态生成的程序集内

我需要把磁盘上某程序集中的方法添加到自己用System.Reflection.Emit生成的动态程序集里。目前的实现流程是:用System.Reflection.Emit创建动态程序集,通过Lokad.ILPack NuGet包将其保存为文件,再用.NET 7的AssemblyLoadContext加载,目标磁盘程序集也是通过同样方式生成的。

需求限制

  • 尽量避免使用外部库,但清楚标准库可能无法满足需求;
  • 禁止使用PInvoke,因为调用方法时目标程序集可能尚未存在;
  • 允许复制包含该方法的整个类型。

创建程序集的示例代码

public static void CreateMethod(string destDllPath)
{
    AssemblyName asmName = new AssemblyName("CAssembly");

    AssemblyBuilder asmBuilder = AssemblyBuilder.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndCollect);
    // 使用RunAndCollect是为了如果AssemblyLoadContext卸载失败,会自动处理

    ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule("CModule");

    TypeBuilder typeBuilder = modBuilder.DefineType("CType", TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed);
    // Abstract | Sealed 表示该类是静态类

    MethodBuilder methodBuilder = typeBuilder.DefineMethod("CMethod",
        MethodAttributes.Static | MethodAttributes.Public,
        CallingConventions.Standard,
        typeof(bool),
        new[] { typeof(bool) });


    ILGenerator ILG = methodBuilder.GetILGenerator();

    ILG.Emit(OpCodes.Ldarg_0);
    // 将第一个参数推入计算栈
    ILG.Emit(OpCodes.Ret);
    // 返回计算栈的第一个元素

    _ = typeBuilder.CreateType();

    AssemblyGenerator asmGenerator = new AssemblyGenerator();
    asmGenerator.GenerateAssembly(asmBuilder, destDllPath);
}

尝试复制方法的代码

public static void CopyMethod(AssemblyBuilder toAssembly, string fromDllPath)
{
    string typeName = "CType";
    string methodName = "CMethod";

    Assembly fromAssembly = Assembly.LoadFile(fromDllPath);
    // 注意:fromDllPath指向的程序集是通过MethodBuilder、ILGenerator和Lokad.ILPack生成的

    Type type = fromAssembly.GetType(typeName)!;

    MethodInfo method = type.GetMethod(methodName)!;

    // 测试生成的程序集是否有效
    // bool testTesult = (bool)method.Invoke(null, new object[] { true });

    // 如何将方法添加到toAssembly中?
}

我目前卡在了如何把目标方法添加到动态生成的toAssembly这一步,已经花了几天时间查找.NET Core 5到7版本中动态程序集创建的相关资料,但可用信息很少。

内容的提问来源于stack exchange,提问作者Aether

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:56:55