2004-10-01から1ヶ月間の記事一覧
hatenaモジュール更新に従ってサイドバーを再編し、カテゴリ表示を追加。 Fotolifeを使って日記で参照する図を置いたりしてもいいのかなぁ〜?
C#から DLL をコールするとき stdcall, cdecl はどうなっているのか? を補足。
最後に残ったこいつを試さずに終わることはできない。 こいつを試すのは他の4つの Sink と違ってちょっと面倒だ。 まず、何が違うかというと IContextProperty の実装クラスで IDynamicProperty を実装し、IContributeDynamicMessageSink を実装する。 最初…
とりあえず、ServerContextSink と ObjectSink の違いはわからないまでも、ここまでの内容から MethodLogger の持っていた2つの問題のうち1つが解決できたことになる。 生成されるすべてのインスタンスに対して個別のコンテキストを割り当て、ServerContex…
実際に4つの Contribute を登録して実行することで、前回の予測は大幅に間違っていることを確認できた。 MethodLogger proxy.XXX() に最も近い場所にいるのは EnvoySink であり、ClientContextSink が1度も呼び出されていないことに注意しなければならない…
さて、実際に上記のクラスを提供する部分ですが、ServerContextSink, ServerContextSink, EnvoySink, ObjectSink の4つのエントリから適切なものを選択しなければなりません。 このうち、簡単に予測がつくものは ServerContext と ClientContext で、これら…
MethodLogger クラスの実装によるものとほとんど同じですが、メッセージシンクは実装を提供しなくてよいので、非常に簡潔になります。 public class MethodLoggerSink : IMessageSink { private readonly IMessageSink next; public MethodLoggerSink(IMessa…
ContextAttribute クラスは IContextAttribute だけでなく、IContextProperty の面倒もみてくれていますが、おそらく、一般的な実装を提供してくれているので、そのまま ContextAttribute を利用してみます。 ContextAttribute クラスのコンストラクタは名前…
やるべきことの目星は付きました。 IContextAttribute の実装 IMessageSink の実装(メソッドのロギング) IMessageSink の提供 これぐらいですね。
SDK ドキュメントでは、 TYPE 型は、.NET Framework インフラストラクチャのサポートを目的としています。独自に作成したコード内で直接使用することはできません。 という文章で何も情報がないが、Google などで検索すると、コンテキスト関係を利用する場合…
困ったときは SDK ドキュメントを全文検索、というわけではないが全文検索。 クラスリファレンスと比べると、かなりましな説明を発見することができた。 コンテキストは、その内部にあるオブジェクトに対して実行時に高度な環境を提供する、アプリケーション…
高度なリモート処理に関する文章で、もう1つ MethodLogger の実装として利用できそうなものとして、IMessageSink インターフェスを扱うことも考えられます。 ところが、このインターフェス。実装するのは難しくないのですが、登録するにはコンテキストにつ…
これは、実質的に対象オブジェクトの this であるように振舞う。 InitializeServerObject() を target stub に対して実行すれば、目的の this はきっちり proxy で固定される。 IConstructionCallMessage ctor = msg as IConstructionCallMessage; if (ctor …
というわけで、MethodLogger についてはおしまいなのだが、MethodLogger 作成後、ここに書き直してるうちにもいろいろ調べたことはあるので、それらについてちょっとづつ。
InitializeServerObject() の呼び出しを加えて、 IConstructionCallMessage ctor = req as IConstructionCallMessage; if (ctor != null) { this.InitializeServerObject(ctor); return EnterpriseServicesHelper.CreateConstructionReturnMessage( ctor, th…
やるべきことは、Invoke() の戻り値の ReturnValue を MethodLogger の生成した proxy にすることです。ここまでの動作を見ると、CreateInsntance() によって取得された proxy はコンストラクタを呼び出すために利用されるが、new した結果のオブジェクトは …
コンストラクタ以降のメソッド呼び出し等が Invoke() にわたって来ないため、どうも InitializeServerObject() によって本物のインスタンスを返してしまっているようです。 対象のオブジェクトが実インスタンスなのか、TransparentProxy なのかは、RemotingS…
CreateInstance() の修正が終わっても、まだ new の処理はおわりません。 やっと stub の Invoke() に処理がやってくるのですが、最初の一発は new した直後に呼ばれるメソッド…、当然コンストラクタの呼び出しです。 コンストラクタと他のメソッドの大きな…
上記のコードでは、正常に実行できません。 base.CreateInstance() で手に入ったオブジェクトに対して GetType() を呼び出すと「コンストラクタ呼び出しが進行中にプロキシを呼び出そうとしました。」と怒られて終了してしまいます。 ProxyAttribute のドキ…
というわけで、上記のトピックを読めばやることはもうわかってしまうと思いますが、話を単純にすると、やるべきことは new の乗っ取りです。 乗っ取られるクラスは ContextBoundObject の派生クラスであるほかに、ProxyAttribute の派生クラスを属性として保…
まずは、SDK の解説を読む必要があるわけだが、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…
メソッド呼び出しを RemotingServices.ExecuteMessage() や MethodInfo.Invoke() を利用して行う場合、this として proxy を渡すことができないだろうか? というところで終わっていました。 しかし、そんな簡単に事が済んだら苦労はしません。 RemotingServ…
今週も土日出社&帰宅0〜1時とか、明らかに時間足りてないとか、体調に影響が出始めてるとか、良い事なし状態です。しかし、いい加減に MethodLogger の残りを終わらせましょう。 書くほどのことは少ないしね。
ふと、id:yaneurao:20041001 から、 この方法を知らない人は、いったいどうやってファイルダイアログで希望のパスに移動しているのだろうか..。まさか、マイコンピュータから辿るのだろうか?それともマイコンピュータ上にショートカットをいったん置くのだ…
帰宅したあと、趣味のコードを書く気分になれないほどの仕事状況は良いとはいえない。 が、少なくとも今週末はそんなかんなで土日も出動。
ツマラナイモノより喜ばれる可能性が高い贈り物なんだけども。
当面の用に足りるところまで終わっているはずなので、のんびりやりますよ。
時間がないと一言にいっても、時間は作るもの。 何かやりたいことがある場合に、その時間を作るコストと、やりたい出来事にかける情熱が天秤に載るだけ。 物理的な時間が足りないという状態になるためには、相当のやりくりが発生している。 まあ、これは自由…