1

我正在尝试将代码注入使用 Mono.Cecil 为 .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 有双重引用

当我添加字典<,> 构造函数时,我发现问题出在此处

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

我究竟做错了什么?

4

1 回答 1

4

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

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

于 2013-03-25T00:09:15.460 回答