从另一个程序集添加TypeDefinition

met*_*hod 4 c# mono.cecil

这个让我发疯.

AssemblyDefinition asm1 = AssemblyDefinition.ReadAssembly(example);
AssemblyDefinition asm2 = AssemblyDefinition.ReadAssembly(example2);
asm2.MainModule.Types.Add(asm1.MainModule.Types[0]);
Run Code Online (Sandbox Code Playgroud)

每当我尝试执行上面的代码时,我得到这个错误'Type already attach'我决定在MonoCecil源代码中看到这个错误,我发现它抛出了这个错误,因为Type的MainMoudle不是asm2 MainModules.所以我决定将该类型复制到一个新类型.

TypeDefinition type2 = new TypeDefinition("", "type2",  Mono.Cecil.TypeAttributes.Class);
foreach (MethodDefinition md in asm2.Methods )
{
        type2.Methods.Add(md);
}
Run Code Online (Sandbox Code Playgroud)

然后将此类型正常添加到我的程序集中,但这会引发另一个错误,"不支持指定的方法.".有什么想法,我收到这个错误?

编辑:只是添加,我试图添加的类型包含一些使用指针的方法.这可能是问题吗?据我所知,mono支持但不支持混合模式.

Jb *_*ain 6

我担心没有内置的,简单的方法来做到这一点.

当您使用Cecil读取程序集时,每个元数据都由模块粘合在一起定义元数据.您不能简单地从模块中获取方法,并将其添加到另一个模块中.

要实现此目的,您需要将MethodDefinition克隆到与另一个模块绑定的MethodDefinition中.同样,还没有内置任何东西.

我建议你看一下IL-Repack,这是一个开源的ILMerge克隆.它就是这样,它从不同的模块中获取类型,并将它们克隆到另一个模块中.

  • 它不会是@ user959615,因为指令可以将元数据作为操作数,就像调用指令的方法一样.需要将其更改为对新模块的方法的引用. (2认同)