从另一个程序集添加TypeDefinition

时间:2012-01-20 14:58:18

标签: c# mono.cecil

这个让我发疯。

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

每当我尝试执行上面的代码时,我都会收到此错误“已附加类型” 我决定在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支持但不支持混合模式。

1 个答案:

答案 0 :(得分:6)

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

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

要实现此目的,您需要将MethodDefinition克隆到与其他模块关联的MethodDefinition中。同样,还没有内置任何内容。

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

相关问题