我想将新类导入现有的程序集。现在我的解决方案是:
首先编写此类并构建它。
然后在ILDASM中检查其IL代码。
TypeDefinition
,Method
Definition
和Instruction
,然后添加到现有的程序集中。由于我不擅长IL和Mono.cecil,这些会花费我很多时间。 所以我想知道有一种简单的方法可以将TypeDefinition导入到另一个吗?比如
var type = other_assembly.MainMoudle.Import(CLASS1).Reslove();
other_assembly.MainModule.Types.Add(type)
答案 0 :(得分:0)
不幸的是,一个简单方法的简短回答是“不”。但是有希望。
问题是对原始类型的引用可能分散在该类型的生成的IL中。一个例子是在属性设置器中更新私有字段的值。该setter中引用的字段是原始属性中的字段。实际上,即使属性本身的属性设置器也是对原始程序集类型中的方法的引用。
要使其工作,您需要查看生成的程序集中的每个引用(结构,变量,指令等),并且必须更新那些自引用的引用,而不是引用新创建的类型。
我知道这是一个难题,因为我编写的代码可以解决您所需的问题。我的代码实际上将源类型的内容附加地复制到目标类型以在C#中启用mixins。如果您花时间查看代码的工作原理,那么您可以修改它。以下是您可能会觉得有用的Bix.Mixers代码的一些链接。
项目:https://github.com/rileywhite/Bix.Mixers.Fody
将引用从原始类型重定向到创建类型(请参阅RootImport方法):https://github.com/rileywhite/Bix.Mixers.Fody/blob/master/src/Bix.Mixers/Fody/ILCloning/ILCloningContext.cs