Библиотека записи Mono.Cecil Target framework 3.5 - записывает ссылку на mscorlib 4.0

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

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

  • Консольное приложение -> скомпилировано v4.0

    • Library that wraps calls to Mono Cecil --> compiled v3.5
    • Mono Cecil -> скомпилированный v3.5 (версия nuget)
  • Внешняя сборка для внедрения -> скомпилирована 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 ‹,>) возвращает тип, имеющий ссылку на mscorlib 4.0.0.0

Что я делаю неправильно?


person codingadventures    schedule 24.03.2013    source источник


Ответы (1)


Если вы используете систему типов времени выполнения, Cecil создаст ссылку на текущую версию, на которую вы ссылаетесь. В этом случае словарь .net 4.0.

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

person Jb Evain    schedule 25.03.2013
comment
Спасибо за ответ. Я не знаю, как этого добиться. Вы имеете в виду, что я должен напрямую загрузить соответствующий mscorlib, а затем искать словарь ‹,› TypeDefinition в типах в MainModule? - person codingadventures; 25.03.2013