我正在尝试使用Mono.Cecil将代码注入为.NET Framework 3.5编译的现有程序集
这是应用程序结构
控制台应用程序 - >编译v4.0
要注射的外部组件 - >编译v3.5
新修改的程序集具有对mscorlib 4.0.0.0和mscorlib 2.0.0.0的双重引用
我发现问题依赖于此,当我添加字典<,>构造函数
const BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
const MethodAttributes methodAttributes =
MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName |
MethodAttributes.RTSpecialName;
var serializableContructor =
typeof(Dictionary<object, object>).GetConstructor(flags, null, new[]
{
typeof (SerializationInfo), typeof (StreamingContext)
}, null);
var serializationConstr = new MethodDefinition(".ctor", methodAttributes, @this.Module.Import(typeof(void)));
serializationConstr.Parameters.Add(new ParameterDefinition(@this.Module.Import(typeof(SerializationInfo))));
serializationConstr.Parameters.Add(new ParameterDefinition(@this.Module.Import(typeof(StreamingContext))));
serializationConstr.Body.Instructions.Add(Instruction.Create(OpCodes.Ldarg_0));
serializationConstr.Body.Instructions.Add(Instruction.Create(OpCodes.Ldarg_1));
serializationConstr.Body.Instructions.Add(Instruction.Create(OpCodes.Ldarg_2));
serializationConstr.Body.Instructions.Add(Instruction.Create(OpCodes.Call, @this.Module.Import(serializableContructor)));
serializationConstr.Body.Instructions.Add(Instruction.Create(OpCodes.Nop));
serializationConstr.Body.Instructions.Add(Instruction.Create(OpCodes.Nop));
serializationConstr.Body.Instructions.Add(Instruction.Create(OpCodes.Ret));
@this.Methods.Add(serializationConstr);
typeof(Dictionary&lt;,&gt;)返回一个引用mscorlib 4.0.0.0的类型
我做错了什么?
答案 0 :(得分:4)
如果您正在使用运行时类型系统,Cecil将创建对您引用的当前版本的引用。在这种情况下,.net 4.0 Dictionary。
如果要将其解耦,则必须使用Cecil类型系统加载正确的装配并为模块创建参考。