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への参照を持つ型を返します
私は何が間違っているのですか?