2014-10-22 66 views
0

我想将一个新类导入到一个存在的程序集中。现在我的解决方案是:有没有简单的方法将类(TypeDefinition)导入到其他程序集?

  1. 先写这门课程并建立它。

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

  3. 创建新的TypeDefinition,Method DefinitionInstruction然后添加到存在的程序集。

这些会花费我很多时间,因为我不擅长IL和Mono.cecil。 所以我想这是有一个简单的方法来导入类型定义到另一个?像

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

你想在编译时或做运行?进口是暂时的还是永久的? – CodeCaster 2014-10-22 08:54:07

+0

Permanent.And运行时更好@codecaster – KyleCTX 2014-10-22 09:17:37

回答

0

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

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

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

我知道这是一个难题,因为我已经编写了一些代码来完成您正在寻找的任务。我的代码实际上将源类型的内容复制到一个目标类型中,以在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

+0

谢谢你的帮助 – KyleCTX 2014-11-03 02:03:47

相关问题