2004-10-01から1ヶ月間の記事一覧

こういう本を読みなさい

と、まあ、そこまで言われたわけではないですが、(お返ししましたが)手渡された一冊。28歳からのリアル マネー編作者: 人生戦略会議出版社/メーカー: WAVE出版発売日: 2004/08メディア: 単行本購入: 1人 クリック: 7回この商品を含むブログ (41件) を見る…

そもそも this とは

なんて見出しをつけるほどの、たいしたことを書くつもりではないのですが、stub の Invoke() は、メソッド解決が完了していないままに呼び出されます。*1 RemotingServices.ExecuteMessage() は、メソッド解決から呼び出しまでを一手に引き受けてくれますが…

はじめに

this に対するメソッド呼び出しについて、手元の MethodLogger は完全な実装を持っていません。 このため、今回からの内容は当時および最近行ったいくつかの試行錯誤や、.NET と CLR が持ついくつかの仕組みの紹介という形になっていくと思います。

今日は

どうにもこうにも頭が回らなくなったので、お昼に3時間睡眠を。まわりに与える印象の悪さはすごいものだっただろうと…、いや、普段からよくないのをなんとかんしないと。 なんてことを書くと、良い職場だなぁと思われるかもしれませんが、土日祝日に出勤し…

FieldGetter と FieldSetter を実装する

この実装には、今度こそリフレクションを利用することとなる。 public override IMessage Invoke(IMessage msg) { :(前略) IMethodCallMessage req = msg as IMethodCallMessage; // FieldGetter と FeildSetter に対して独自の実装を提供する if ((req.M…

FieldGetter と FieldSetter

幸運なことに、internal method の呼び出しは RemotingServices.ExecuteMessage() でサポートされているらしく、問題なく実行することができる。 よって、問題となるのは internal field の取得に限定された。ここで、問題解決には、Remoting と MarshalByRe…

Remoting の制限

その問題点とは、RemotingServices.ExecuteMessage() によって実行できないメッセージが存在するのだ。 たとえば、Control の派生クラスに対して MethodLogger を作成しフォームに追加するだけで "Control.parent が見つかりません。" といった内容の例外が…

任意のクラスへの拡張

Form1Proxy は Form1 クラス専用ではあるが、これを任意のクラスに対して拡張することは一見、難しくない。 呼び出しを記録するインスタンスを受け取り、そのインスタンスに対応した proxy を生成するだけである。 public class MethodLogger : RealProxy { …

this.Add() と form1.Add() の違い

RemotingServices.ExecuteMessage を使った実装は、非常に簡単ではあるものの、proxy の管理に関する問題として、this の取り扱いがある。 public class Form1 : MarshalByRefObject, ICloneable { private int current = 0; public int Add(int value) { ch…

MarshalByRefObject クラス

MarshalByRefObject クラスがいったい何なのか、リファレンスを開いてみてもすぐには理解できないかもしれない。 とりあえず、MarshalByRefObject クラスの派生クラスじゃないとダメなんだと機械的に覚える程度で問題はない。 覚えておくほうがよいと思われ…

より汎用的な Invoke() の実装

このような問題を解決するには、リフレクションを利用するというのがすぐに思いつく手段ではあるが、*1 RealProxy クラスや ReturnMessage クラス同様に、IMethodCallMessage を処理する機能が .NET によって最初から用意されている。 private Form1 form1 =…

なぜ new Form1() をしていたのか

すでに予想ができていることとは思うが、前回の方式では Form1 クラスと Form1Proxy クラス双方で、まったく同じロジックとデータを持たなくてはならない。*1 このままでは対象のクラスの中身を完全に理解していないと stub の実装ができないことになってし…

MethodLogger ( 2 )

前回までのお話 メソッド呼び出しを記録するため、.NET Remoting などで利用される TransparentProxy を使い、特定のクラスのメソッド呼び出しを受け取る RealProxy 派生クラスを作成するまで。前回、まだ動かないという状態になっているのを、今回はとりあ…

Invoke() を実装する

Invoke() は、メソッド呼び出しである。 何をしなければならないかはわかりきっている。この場合は Add() を実行するだけだ。 メソッドに戻り値があるように、TransparentProxy に対する操作は、必ずなんらかのメッセージを応答として返さなければならない。…

メソッド呼び出しを記録する

とりあえず、実装に入るためには、 Form1 クラスが先に必要なので、 public Form1 { private int current = 0; public int Add(int value) { checked { int oldValue = current; this.current += value; return oldValue; } } }このような単純なクラスである…

TransparentProxy とメソッド呼び出し

ものすごく長くなりそうな気がするので、そろそろ主題に近づいていこう。 TransparentProxy の仕事は、主に2つで、至極単純である。 TransparentProxy の仕事の1つは、前述のような型チェックに関する誤魔化しであり CLR が isinst 等の実装で特別扱いして…

TransparentProxy

とりあえず、Form1Proxy クラスを利用することで、Form1 の TransparentProxy を得ることができた。こいつはいったい何ができるのか? まず、こいつは C# や VB.NET というプログラム言語のレベルどころか、IL のレベルまで降りて見ても明らかに異常なヤツで…

TransparentProxy と RealProxy

実際、GetTransparentPropxy() によって得られるのは 引数として渡した Form1 のインスタンスではなく、.NET Remoting のコアとなる TransparentProxy と言うオブジェクトである。 この TrapsparentProxy を生成するには、通常は RemotingServices クラスな…

メソッド呼び出しを記録する

ま、このネタはそこらじゅうで見かけることができる気がするが、せっかくなので書いてみよう。 事前にはっきり書いておくと、まともな説明にならない上に、すごく長い。 メールをくれた1名は読んでくれるかもしれないが、相当気合がないと読めないかもしれ…

MethodLogger ( 1 )

その前に 昨日、プロフィールというものを登録できるようになったので、登録してみた。 サイドバーに表示しているプロフィールは、【無料】似顔絵イラストメーカー :フリーでプロフィール画像を作成 さんで MSN Messeager 用に作成したもの。 アニメ絵ではな…

たんに

MemoryStream を分割して使用するクラスを作ろうとしたら、MemoryStream だけでできちゃった…というだけだったんですが。

MemoryStream.ToArray()

このメソッドは対象の MemoryStream によって読み出し可能なすべての内容を取り出すメソッドであるが、取り出されたバイト列は常にストリームの複製であることに注意する。 バイト列を作成する際、ストリームとして書き込みを行った結果を得るだけならば Get…

固定長さな MemoryStream

MemoryStream のコンストラクタのオーバーロードは、すべて固定長の MemoryStream を作成するためにある。 固定長の MemoryStream を作成するためには、かならずバッキングストアとなる固定長のバイト列をコンストラクタに指定する必要がある。 各コンストラ…

可変長な MemoryStream

可変長の MemoryStream を作成する場合、そのバッキングストアとなるメモリは MemoryStream が自由に変更できなければならないし、書き込めないストリームの長さを変更する必要性はほとんどない。 このため、可変長の MemoryStream は書き込みが可能であり、…

MemoryStream

お手軽な可変長メモリを読み書きできるストリーム実装とは仮の姿。実はコンストラクタによっていくつもの動作モードがあることは知られているだろうか? 固定長か、可変長か? 書き込み可能か、読み取り専用か? バッキングストアとなるメモリは公開可能か?…

Essencial .NET

読んでみたい本である。 こういう眠れない夜に手元にあると、読み終わった頃には朝になっていて仕事がきつくなる。

先頭行に時刻出力をもつ TraceLister の完全なコード

前述のように、TraceListener の実装をすべて行ってもよいのだが、もっと簡単に DefaultTraceListener を継承してほんの数行で作成することができる。 現在時刻の取得は DateTime.Now を利用し、パフォーマンス面の品質管理の一時チェックに利用できる程度の…

カスタム TraceListner の作成

Debug クラスおよび Trace クラスの出力先となる TraceListener クラスは、このクラスを派生して Write(string) と WriteLine(string) を実装するだけですぐに使えるようになるだけの実装を持っている。 Write(string) メソッドと WriteLine(string) の違い…

Switch クラス(BooleanSwitch クラス, TraceSwitch クラス)

前述した Switches を使用するクラスが、Switch クラスとその派生クラスである。 使用方法はドキュメントを読めばすぐにわかると思うが、これらのクラスは Switches から指定した要素の値を取り出すだけのクラスである。 System.Diagnostics/Switches 要素の…

DefaultTraceListener クラスとアプリケーション設定ファイル

DefaultTraceListener にはいくつかのプロパティがあり、出力のカスタマイズが可能になっているが、プロジェクトのルートに app.config という名前で XML ファイルを作成し、*1 <Configuration> <System.Diagnostics> <LogFilename>log.txt</LogFilename> </System.Diagnostics> </Configuration>のような記述を加えることでもう少しカスタマイズの幅を広げること…