- PR -

クラスをフックする

投稿者投稿内容
NothingButXMLInfoSet
ベテラン
会議室デビュー日: 2003/03/31
投稿数: 65
投稿日時: 2003-05-23 14:22
この辺の話は、Essential .NETにわりと詳しく出ています。

#日本語版がそろそろ出そうです。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2003-05-23 15:19
引用:

NothingButXMLInfoSetさんの書き込み (2003-05-23 14:22) より:
この辺の話は、Essential .NETにわりと詳しく出ています。
#日本語版がそろそろ出そうです。


あー、日本語版でるんですか、たのしみー。
ちなみに、この本で推薦(?)されているC#プライマーはいつの間にか
翻訳されてでてますね。
anna
会議室デビュー日: 2003/05/24
投稿数: 1
投稿日時: 2003-05-24 06:29
こんにちわ、はじめての書き込みです。

引用:

小野@EACさんの書き込み (2003-05-23 09:31) より:
Activator.GetObjectメソッドが無理やり型変換を行うと考えると
いいですかね。
ここでの型変換は無理やりなので、もし指定した型が合ってないと
実行時にエラーが起きます。



無理やり型変換を行うというよりは、
remotingの場合には、型を無視して
無理やりメソッドを呼び出すという
感じではないですか?
kekyo
会議室デビュー日: 2002/12/12
投稿数: 13
投稿日時: 2003-05-27 16:43
こんにちは。

引用:

無理やり型変換を行うというよりは、
remotingの場合には、型を無視して
無理やりメソッドを呼び出すという
感じではないですか?



「それ」も謎として存在します。つまり、

1:GetObject()の戻り値はobjectなので、実行時にHogeクラスへのキャストを試みるが、全く関係の無い__TransparentProxyクラスからHogeクラスにキャストしても例外が発生しない。
2:キャストが出来たとしてキャスト後のメソッド呼び出しは、本来のコードが実行されずに、リモートのメソッドが呼ばれる(もちろんインスタンスthisもリモートのものが使用される)その方法。

の2つの謎があります。
ちなみに後者はSystem.Reflection.Emitを使えばなんとかなるかも?と考えています。
ただ、生のCLRコードを書く必要がある(あるいはMictosoft.CSharp以下を使用するでもいいのですが)ので、もっと標準的な方法が無いかなと思うのですが...

Emitについては以下の記事を参考にしました。
http://msdn.microsoft.com/library/en-us/Dndotnet/html/rflemitcache.asp
kekyo
会議室デビュー日: 2002/12/12
投稿数: 13
投稿日時: 2003-05-30 10:08
こんにちは。

遂に回答と呼べるものにたどり着きました

今までの焦点になっていた__TransparentProxyクラスについては
やはり明確なことは判っていません。
このクラス自体公開されていないので、実装の詳細は「怪しげなことを
している」ということしか判りませんでした。

が、クラスをフックするという目的は達成できました!

.NET Framework SDK のサンプルをインストールすると、以下の
ディレクトリにカスタムプロキシクラスのサンプルコードが
インストールされます。

Samples\Technologies\Remoting\Advanced\CustomProxies\

このディレクトリには3通りの例が載っていますが、ProxyWithReturnMessage.cs
あたりが簡単ではないだろうかと目星をつけてみてみました。
実行してみれば判りますが、要するにHogeクラスのメンバ呼び出しなどを
メッセージとして受け取って解析することが出来ます。
これを行うのにRealProxyクラスを継承して使用します。

RealProxyクラスにはGetTransparentProxy()メソッドがあり、
このメソッドを呼び出すと、「例の」__TransparentProxyクラスの
インスタンスが作成されます。

予想はしていましたが、これは凄いです。

ちなみに__TransparentProxyクラスでは、ベースにしたクラス
(最初の例ではHogeクラス)をどの型にキャストできるかがわからないため、
RealProxy.CanCastTo()メソッドでその判定を行うようです。
そのサンプルも ProxyWithCustomCasting.csにあります。

この件の探索中は、結局何がしかの方法が見つかってもRemotingに
依存していて汎用のクラスフックに使えないのではないかと感じていたのですが、
この方法は完全に汎用でRemotingで使用しなくても使えます!
(実際、ProxyWithReturnMessage.csはリモート呼び出ししていません)

いやー、すっきりしました。__TransparentProxyクラスの実装の件は忘れます

それでは。

スキルアップ/キャリアアップ(JOB@IT)