Mono.Cecil写库目标框架3.5 -它写引用到mscorlib 4.0

本文关键字:引用 mscorlib Cecil 目标 框架 Mono | 更新日期: 2023-09-27 18:05:30

我正在尝试注入代码到使用Mono为。net Framework 3.5编译的现有程序集。塞西尔

应用程序结构

  • 控制台应用程序->编译v4.0

    • 封装Mono Cecil调用的库->编译v3.5
    • Mono Cecil ->编译v3.5 (nuget版本)
  • 要注入的外部程序集-->已编译v3.5

新修改的程序集有对mscorlib 4.0.0.0和mscorlib 2.0.0.0的双重引用

我发现问题出现在这里,当我添加一个dictionary<>构造函数

 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的类型

我做错了什么?

Mono.Cecil写库目标框架3.5 -它写引用到mscorlib 4.0

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

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