C# で、アプリケーション A が などのアプリケーション ハンドルを使用してアプリケーション B を呼び出す場合、アプリ A は(IAppB)Activator.CreateInstance(Type.GetTypeFromProgID('AppB')).CallMe()
どのようにしてアプリ B に呼び出しを送信しますか? 私はハードウェア層の説明を求めているのではなく、何らかの形でアプリケーションへのメソッド呼び出しをキャプチャして、それらをいじることができるかどうかを理解しようとしています。
2 に答える
使用法と名前を考えると、おそらくアウトプロセス COM サーバーに対してメソッド呼び出しを行っていることになります。そのメカニズムは本を埋めることができます (多くが書かれています) ので、簡単な概要を示します。
ボールは、レジストリに保存されている構成情報を使用して COM サーバーを起動することで転がり始めます。基礎となるネイティブ API 呼び出しは CoCreateInstance() です。次に、COM インフラストラクチャはレジストリを使用して、プロキシおよびスタブとして機能する DLL を検出します。プロキシの仕事は、使用している正確な COM インターフェイスをエミュレートすることです。この場合、CallMe() メソッドを宣言したコクラスのデフォルト インターフェイスです。
プロキシは、渡された引数があればシリアル化し、RPC を呼び出して呼び出し要求をサーバーに発行します。サーバー側では、スタブはクライアント コードとして機能します。引数を逆シリアル化し、実際の呼び出しを行います。呼び出しの結果、少なくとも HRESULT、およびおそらく参照によって渡され、コピーして戻す必要があるすべての引数は、呼び出しを完了するためにプロキシに戻ります。
低レベルの RPC 境界でこのスキームをいじるのは実用的ではありません。ただし、技術的には独自のプロキシとスタブを作成できます。重大な障害があります。これらは通常、IDL ツールによって IDL 言語で記述されたインターフェイスの記述から自動生成されます。少なくとも、インターフェイスがどのように見えるかを正確に把握するには、その IDL が必要です。サーバーのソースコードを所有することはめったになく、IDL も持っていないため、これは難しい傾向があります。サーバーにタイプ ライブラリがある場合は、タイプ ライブラリを逆コンパイルできる可能性があります。遅延呼び出しを行っているため、それはありそうにありません。最後になりましたが、RPC について十分に理解している必要があります。難しすぎる、それは非常にあいまいです。
ここで複数のことを混同しています
- アプリケーション A がアプリケーション B を呼び出す - これは通常、「プロセス A」が「プロセス B」を呼び出すことを意味します。
- メソッド B を呼び出す C# メソッド A - C# での通常の呼び出し
- C# の COM 呼び出し (これは yr コード スニペットが行っていることです)
- リフレクション手法による呼び出し。これはあなたのサンプルにもあります
あなたの質問への答えは、あなたが話しているものによって異なります。
同じアプリ ドメイン内の関数 A と関数 b の間に一般的に配置するだけの場合は、AOP - C# でのアスペクト指向プログラミングを調べてください。
または傍受http://www.codeproject.com/Articles/8436/Intercepting-method-calls-in-C-an-approach-to-AOSD
または城の動的プロキシを見てくださいhttp://docs.castleproject.org/Default.aspx?Page=DynamicProxy