3

基本クラスのメソッドへの MethodReference を名前で取得するにはどうすればよいですか?

私はもう試した

type.BaseType.Resolve().Methods;

基本クラスを含む dll を assemblyresolver に追加すると、メソッドが返されます。しかし、使用して呼び出しを追加すると

MSILWorker.Create(OpCodes.Call, baseMethod);

(baseMethod は、解決された TypeDefinition からメソッドを foreach することによって検出されました) 結果の IL は読み取り不能であり、Reflector がフリーズして終了することさえあります。

今いくつかの IL:
タイプでプライベート メソッドを呼び出す場合:

 call instance void SomeNamespace.MyClass::RaisePropertyChanged(string)

基本型で保護されたメソッドを呼び出す場合:

call instance void [OtherAssembly]BaseNamespace.BaseClass::RaisePropertyChanged(string)

では、Mono.Cecil を使用して後者を作成するにはどうすればよいでしょうか。

4

1 に答える 1

5

ご想像のとおり、モジュールをスコープとする適切な MethodReference を取得する必要があります。あなたが持っている場合:

TypeDefinition type = ...;
TypeDefintion baseType = type.BaseType.Resolve ();
MethodDefinition baseMethod = baseType.Methods.First (m => ...);

次に、baseType と baseMethod は別のモジュールからの定義です。使用する前に baseMethod への参照をインポートする必要があります。

MethodReference baseMethodReference = type.Module.Import (baseMethod);
il.Emit (OpCodes.Call, baseMethodReference);
于 2011-02-04T15:34:37.363 に答える