编程语言
首页 > 编程语言> > c# – 从另一个程序集添加TypeDefinition

c# – 从另一个程序集添加TypeDefinition

作者:互联网

这个让我发疯.

AssemblyDefinition asm1 = AssemblyDefinition.ReadAssembly(example);
AssemblyDefinition asm2 = AssemblyDefinition.ReadAssembly(example2);
asm2.MainModule.Types.Add(asm1.MainModule.Types[0]);

每当我尝试执行上面的代码时,我都会收到此错误“Type has attached”
我决定在MonoCecil源代码中查看此错误,我发现它会抛出此错误,因为Type的MainMoudle不是asm2 MainModules.所以我决定将该类型复制到一个新类型.

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

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

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

解决方法:

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

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

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

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

标签:c,mono-cecil
来源: https://codeday.me/bug/20190530/1184772.html