【问题标题】:Adding a TypeDefinition from another Assembly从另一个程序集添加 TypeDefinition
【发布时间】:2012-02-15 03:10:42
【问题描述】:

这个快把我逼疯了。

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);
}

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

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

【问题讨论】:

  • 您确定没有收到原始错误,因为asm1 中定义的类型之一也在asm2 中定义?
  • 不,我完全确定我要添加的类型不在 asm2 中。

标签: c# mono.cecil


【解决方案1】:

恐怕没有内置的简单方法可以做到这一点。

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

要实现这一点,您需要将 MethodDefinition 克隆到绑定到其他模块的 MethodDefinition 中。同样,还没有任何内置功能。

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

【讨论】:

  • 嗯,我会看看它,但我有最后一个问题,如果我循环遍历该方法的每条指令,然后将其添加到新方法中,然后将其添加到我的类型中。这行得通吗?
  • @user959615 它不会,因为指令可以将元数据作为操作数,就像调用指令的方法一样。需要将其更改为对新模块中方法的引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多