0

Assembly.load() を使用して、アセンブリ B をアセンブリ A の appdomain にロードしました。

Bには、メモリアドレス/ポインタを取得する必要がある「X」という名前のメソッドがあります。

B は、assembly.load() の後に単一の連続したメモリ データとしてメモリにマップされることを理解しています。GetHInstance(module) を使用してこの場所に到達できます。RVA オフセットを使用して B のコード セグメントに到達しても、B は生のオフセットを使用してマップされるため、機能しません。

A 内から X のメモリ アドレスを取得するにはどうすればよいですか?

4

1 に答える 1

0

これの最終目標は何ですか?アンマネージ コードに渡す関数ポインターが必要ですか? その場合、それは機能しないためです。RVA は、プロセスが実行できないネイティブ コードではなく、IL コードのみを指す可能性があります。

このデモでは、メソッドが Action シグネチャ (パラメーターなしで void 型を返す) に一致し、静的であり、クラス FullyQualified.TypeName で SomeMethod と呼ばれていると仮定します。ローカル スコープでアセンブリ参照 "asm" が与えられた場合:

Type t = asm.GetType("FullyQualified.TypeName");
MethodInfo method = t.GetMethod("SomeMethod", BindingFlags.Public | BindingFlags.Static);

この時点で、本当にメソッド本体が IL に必要な場合は、次を呼び出すことができます。

MethodBody body = method.GetMethodBody();

または、ネイティブコードに渡すことができるネイティブコードが必要な場合は、次のようにします。

Action action = (Action)method.CreateDelegate(typeof(Action));
IntPtr ptr = Marshal.GetFunctionPointerForDelegate(action);

インスタンス メソッドを見ている場合は、他にも必要なことがあります (たとえば、インスタンスを MethodInfo.CreateDelegate の 2 番目のパラメーターとして渡したり、バインディング フラグを変更したりする必要があります)。適切な権限があれば、このメカニズムを介してプライベート メソッドにアクセスすることもできます。

于 2012-12-05T04:38:41.907 に答える