.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
相关产品推荐
相关产品推荐

