2004-10-22から1日間の記事一覧

最終的に

InitializeServerObject() の呼び出しを加えて、 IConstructionCallMessage ctor = req as IConstructionCallMessage; if (ctor != null) { this.InitializeServerObject(ctor); return EnterpriseServicesHelper.CreateConstructionReturnMessage( ctor, th…

コンストラクタの戻り値を変更する

やるべきことは、Invoke() の戻り値の ReturnValue を MethodLogger の生成した proxy にすることです。ここまでの動作を見ると、CreateInsntance() によって取得された proxy はコンストラクタを呼び出すために利用されるが、new した結果のオブジェクトは …

InitializeServerObject() により返されるものは?

コンストラクタ以降のメソッド呼び出し等が Invoke() にわたって来ないため、どうも InitializeServerObject() によって本物のインスタンスを返してしまっているようです。 対象のオブジェクトが実インスタンスなのか、TransparentProxy なのかは、RemotingS…

CreateInstance の後

CreateInstance() の修正が終わっても、まだ new の処理はおわりません。 やっと stub の Invoke() に処理がやってくるのですが、最初の一発は new した直後に呼ばれるメソッド…、当然コンストラクタの呼び出しです。 コンストラクタと他のメソッドの大きな…

new をきちんと乗っ取る

上記のコードでは、正常に実行できません。 base.CreateInstance() で手に入ったオブジェクトに対して GetType() を呼び出すと「コンストラクタ呼び出しが進行中にプロキシを呼び出そうとしました。」と怒られて終了してしまいます。 ProxyAttribute のドキ…

new Form1() を乗っ取る

というわけで、上記のトピックを読めばやることはもうわかってしまうと思いますが、話を単純にすると、やるべきことは new の乗っ取りです。 乗っ取られるクラスは ContextBoundObject の派生クラスであるほかに、ProxyAttribute の派生クラスを属性として保…

ContextBoundObject クラスに関する文章

まずは、SDK の解説を読む必要があるわけだが、ContextBoundObject クラスから入っていくと、はっきり言って意味不明に近い解説が書いてあると思ってしまう人が多いのではないだろうか。 メソッドは何も増えていないし、説明はわけわからない。関係あるクラ…

ContextBoundObject クラス

元々、Object 派生クラスは、外部からのメソッド呼び出しを解決する処理に対して割り込むことができなかった。*1 これは MarshalByRefObject を派生元クラスにすることで解決し、CLR が OOP のメッセージ送受信を IMessage と Invoke() を利用した形にして、…

スタブのプロキシを作る

ということは、自分自身の呼び出しを自分自身ではない別のスタブへリダイレクトしたら? public static MarshalByRefObject Attach(MarshalByRefObject o) { Trace.Assert(o != null); MethodLogger stub = new MethodLogger(o); MethodLogger proxy = new M…

MethodLogger (4)

メソッド呼び出しを RemotingServices.ExecuteMessage() や MethodInfo.Invoke() を利用して行う場合、this として proxy を渡すことができないだろうか? というところで終わっていました。 しかし、そんな簡単に事が済んだら苦労はしません。 RemotingServ…

いい加減に書ききる

今週も土日出社&帰宅0〜1時とか、明らかに時間足りてないとか、体調に影響が出始めてるとか、良い事なし状態です。しかし、いい加減に MethodLogger の残りを終わらせましょう。 書くほどのことは少ないしね。