我试图将代码注入到使用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的双重引用

我发现问题在于此,当我添加一个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的引用的类型

我究竟做错了什么?

最佳答案

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

如果要对此进行解耦,则必须使用Cecil类型系统来加载正确的组件并为模块创建参考。

关于c# - Mono.Cecil写库目标框架3.5-它写入对mscorlib 4.0的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15603220/

10-11 00:40