2013-03-24 55 views
1

我试图将代码注入到使用Mono.Cecil能Mono.Cecil能写库目标框架3.5 - 写入参考MSCORLIB 4.0

这是应用程序结构

现有装配编译为.NET Framework 3.5的
  • 控制台应用程序 - >编译V4.0

    • 库,它包装调用单塞西尔 - >编译器v3.5
    • 单丝丝 - >编译V3.5(的NuGet版本)
  • 外部组件以被喷射 - >编译V3.5

新修改的组件具有双参考mscorlib程序4.0.0.0和2.0.0.0的mscorlib

我发现这个问题依靠这里,当我添加一个词典<,>构造

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(字典<,>)返回一个引用mscorlib的类型4.0.0.0

我做错了什么?

回答

4

如果您使用的是运行时类型系统,则Cecil将创建对您所引用的当前版本的引用。在这种情况下,.net 4.0 Dictionary。

如果你想解耦,你必须使用Cecil类型系统来加载正确的程序集并为你的模块创建参考。

+0

感谢您的回复。我不知道如何实现这一点。你的意思是我应该直接加载适当的mscorlib,然后搜索字典<,>在MainModule类型中的TypeDefinition? – codingadventures 2013-03-25 00:30:38