1

Mono.Cecilを使用して.NETFramework3.5用にコンパイルされた既存のアセンブリにコードを挿入しようとしています

これがアプリケーションの構造です

  • コンソールアプリケーション->コンパイル済みv4.0

    • MonoCecilへの呼び出しをラップするライブラリ->コンパイルされたv3.5
    • Mono Cecil->コンパイル済みv3.5(nugetバージョン)
  • 注入される外部アセンブリ->コンパイルされたv3.5

新しく変更されたアセンブリには、mscorlib4.0.0.0とmscorlib2.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 <、>)は、mscorlib4.0.0.0への参照を持つ型を返します

私は何が間違っているのですか?

4

1 に答える 1

4

ランタイム型システムを使用している場合、Cecilは参照している現在のバージョンへの参照を作成します。その場合、.net4.0ディクショナリ。

これを切り離したい場合は、Cecil型システムを使用して適切なアセンブリをロードし、モジュールの参照を作成する必要があります。

于 2013-03-25T00:09:15.460 に答える