有没有一种简单的方法可以将类(TypeDefinition)导入其他程序集?

时间:2014-10-22 08:30:22

标签: c# mono.cecil

我想将新类导入现有的程序集。现在我的解决方案是:

  1. 首先编写此类并构建它。

  2. 然后在ILDASM中检查其IL代码。

  3. 创建新的TypeDefinitionMethod DefinitionInstruction,然后添加到现有的程序集中。
  4. 由于我不擅长IL和Mono.cecil,这些会花费我很多时间。 所以我想知道有一种简单的方法可以将TypeDefinition导入到另一个吗?比如

    var type = other_assembly.MainMoudle.Import(CLASS1).Reslove();
    other_assembly.MainModule.Types.Add(type)
    

1 个答案:

答案 0 :(得分:0)

不幸的是,一个简单方法的简短回答是“不”。但是有希望。

问题是对原始类型的引用可能分散在该类型的生成的IL中。一个例子是在属性设置器中更新私有字段的值。该setter中引用的字段是原始属性中的字段。实际上,即使属性本身的属性设置器也是对原始程序集类型中的方法的引用。

要使其工作,您需要查看生成的程序集中的每个引用(结构,变量,指令等),并且必须更新那些自引用的引用,而不是引用新创建的类型。

我知道这是一个难题,因为我编写的代码可以解决您所需的问题。我的代码实际上将源类型的内容附加地复制到目标类型以在C#中启用mixins。如果您花时间查看代码的工作原理,那么您可以修改它。以下是您可能会觉得有用的Bix.Mixers代码的一些链接。

项目:https://github.com/rileywhite/Bix.Mixers.Fody

结构线框克隆:https://github.com/rileywhite/Bix.Mixers.Fody/blob/master/src/Bix.Mixers/Fody/ILCloning/ClonerGatheringVisitor.cs

将引用从原始类型重定向到创建类型(请参阅RootImport方法):https://github.com/rileywhite/Bix.Mixers.Fody/blob/master/src/Bix.Mixers/Fody/ILCloning/ILCloningContext.cs