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

本文关键字:TypeDefinition 导入 其他 程序集 方法 一种 简单 有没有 | 更新日期: 2023-09-27 18:27:28

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

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

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

  3. 创建新的TypeDefinitionMethod DefinitionInstruction,然后添加到现有程序集

这些会花费我很多时间,因为我不擅长IL和Mono.ecil。所以我想知道有没有一种简单的方法可以将TypeDefinition导入另一个TypeDefinition?像

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

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

不幸的是,简单方法的简短答案是"否"。但还是有希望的。

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

要做到这一点,您需要查看生成的程序集中的每个引用(结构、变量、指令等),而那些自引用的引用必须更新为引用新创建的类型。

我知道这是一个棘手的问题,因为我编写的代码可以满足您的需求。我的代码实际上将源类型的内容添加到目标类型中,以在C#中启用mixin。如果你花时间研究一下代码是如何工作的,那么你可以修改它。以下是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