クラスをフックする@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。11:04こんにちは。FrameworkではSystem.Runtime.Remoting以下のクラスを使ったリモート処理が可能です。これらのサポートを使用して、別のマシンに存在するクラスのインスタンスをリモート処理する時に、以下のようなコードで参照を取得します。"tcp://remote.com:1234/Hoge");このhogeはリモートのインスタンスを参照しているため、メソッドやプロパティの呼び出しなどは全てリモートに中継されます。不思議なのはここからで、このhogeが参照している(ローカルの)インスタンスは、hogeが実体化したもの「ではなく」、System.Runtime.Remoting.Proxies.__TransparentProxyというクラスです。(MSDNライブラリには載っていません。ildasmでmscorlibを覗くと見えます。)ローカルのインスタンスがhogeではないというのは、何となくわかります。ローカルにhogeのインスタンスがあっても無意味だからです。この__TransparentProxyクラスがHogeクラスをシミュレートしているのだろうということは理解できます。Activator.GetObject()が返したSystem.ObjectをHogeクラスでキャスト出来ることが謎です。Hogeでキャスト出来る為には、オブジェクトのインスタンスがHogeクラス自身か、Hogeクラスを継承している必要があると思います。__TransparentProxyクラスはSystem.Objectから直接派生しています。通常ならどうやってもキャスト出来ないと思います。CLRのキャストメカニズムに何か「仕掛け」があるのではないかと思っていますが、判りませんでした。この仕掛けを利用する手段があれば、実行時に動的にカスタマイズしたクラスを生成して、メソッドやプロパティへのアクセスをフックして、追加処理を行わせることが出来るのではないかと思っています。何か情報をもっていましたらお願いします。#実行時にクラスを動的に継承して新しいクラスを作ることは出来ます。#(System.Reflection.Emitを使う。面倒)#そうすれば、前述のようにHogeにキャストして使用することが出来ます。#が、「継承した」というしばりから逃れられません。11:54こんにちは。:しかし、Activator.GetObject()が返したSystem.ObjectをHogeクラスでキャスト出来ることが謎です。Hogeでキャスト出来る為には、オブジェクトのインスタンスがHogeクラス自身か、Hogeクラスを継承している必要があると思います。__TransparentProxyクラスはSystem.Objectから直接派生しています。通常ならどうやってもキャスト出来ないと思います。ヘルプの「明示的な参照変換」のところに、次のような記述があります。基本クラスである場合。いうことで、キャストはできる(あくまでコンパイルが通るというレベルになりますが)ことになると思います。外していたらすみません。19:21こんにちは。:ヘルプの「明示的な参照変換」のところに、次のような記述があります。基本クラスである場合。いうことで、キャストはできる(あくまでコンパイルが通るというレベルになりますが)ことになると思います。その通り、コンパイルは通ります。実行時の型チェックで__TransparentProxyクラスをHogeクラスにキャストしようとするので(本当なら)例外が発生します。この例ではそれが発生しないのです。GetObject()が間違いなく__TransparentProxyクラスを返していることはデバッガで確認しています。11:49こんにちは。ヘルプの以下のところと、いくつかのクラスライブラリに関する説明文からの情報です。「オブジェクト参照、プロキシ、メッセージ、およびメッセージシンク」---------------------------------------------------------------------------System.MarshalByRefObjectには、CreateObjRef()というメソッドがある。そのメソッドは、System.Runtime.Remoting.ObjRefという型のオブジェクトを返す。System.Runtime.Remoting.ObjRefにはTypeInfoというプロパティがある。そのプロパティは、IRemotingTypeInfoというオブジェクトにアクセスする。IRemotingTypeInfoにはCanCastTo()というメソッドがある。生成されたプロキシをキャストしようとすると、現在のメソッドが呼び出されます。