2013-03-24 52 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