2013-03-24 1 views
1

Я пытаюсь внедрить код в существующей сборке, скомпилированные для .NET Framework 3.5 с помощью Mono.CecilMono.Cecil написать библиотеки Target Framework 3.5 - пишет ссылку на mscorlib 4.0

Это структура приложения

  • Console Application

    -> компилируется v4.0

    • библиотека, которая заворачивает вызовы Mono Cecil -> компилируется v3.5
    • Моно Cecil -> скомпилирован 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.

Если вы хотите отделить это, вы должны использовать систему типа Cecil для загрузки соответствующей сборки и создания ссылки для вашего модуля.

+0

благодарит за ваш ответ. Я не уверен, как это достичь. вы имеете в виду, что я должен загрузить непосредственно соответствующий mscorlib, а затем искать словарь <,> TypeDefinition в пределах типов MainModule? – codingadventures

 Смежные вопросы

  • Нет связанных вопросов^_^