RealProxy の拡張
特にプロキシ作成プロセス、マーシャリング、またはオブジェクト ID に参加する場合には、プロキシの拡張が役立つことがあります。独自のプロキシを構築するには、拡張可能な RealProxy クラスを使用します。カスタム プロキシを構築するときには、RealProxy クラスの派生クラスを作成し、RealProxy.Invoke メソッドをオーバーライドする必要があります。ProxyAttribute 属性から派生し、属性を ContextBoundObject の子に適用することによって、new (Visual Basic では New) ステートメントを受け取ることができます。プロキシ属性を MarshalByRefObject の子に適用することはサポートされていません。new が呼び出されると、派生した ProxyAttribute は、カスタム プロキシのインスタンスを作成します。カスタム プロキシのインスタンスは、アプリケーションから直接作成することもできます。
アプリケーションのコードがカスタム プロキシのメソッドを呼び出すと、オーバーライドされた RealProxy.Invoke メソッドが、IMessage を実装するオブジェクトを使って呼び出されます。IMessage 実装は、メソッドに関する情報の名前と値の組み合わせを提供する IDictionary 実装を提供します。ディクショナリの特定のエントリに関する詳細については、IMessage インターフェイスとその関連インターフェイス (IMethodCallMessage および IMethodReturnMessage) のリファレンス ドキュメントを参照してください。
実際のオブジェクトは、オーバーライドされた Invoke メソッドから、呼び出しを実際のオブジェクトにディスパッチする RemotingServices.ExecuteMessage を呼び出すことによって呼び出されます。
EnterpriseServicesHelper.CreateConstructionReturnMessage メソッドを使用することにより、IConstructionCallMessage 実装を処理して IConstructionReturnMessage 実装を生成することもできます。また、RealProxy.InitializeServerObject メソッドを使用して、バッキング オブジェクトを作成することもできます。
派生した ProxyAttribute を使用すると、オーバーライドされた ProxyAttribute.CreateInstance メソッドで実際のオブジェクトを作成し、それをカスタム プロキシにフィールドとして格納できます。カスタム プロキシは、実際のオブジェクトをマーシャリングして、URI (Uniform Resource Identifier) を保持している ObjRef オブジェクトを取得できます。IMessage.Properties プロパティから返されるコレクション内の "__Uri" エントリは、呼び出しを実際のオブジェクトにディスパッチするために IMessage 実装で設定されている必要があるため、URI はプロキシに格納する必要があります。
もちろん、メッセージを実際のオブジェクトにディスパッチする必要はありません。オブジェクトに対する操作の一部は Invoke で実行でき、IMethodReturnMessage インターフェイスを実装するオブジェクトを生成して返すこともできます。
マーシャリングに参加するには、RealProxy.CreateObjRef をオーバーライドし、ObjRef を拡張したカスタム ObjRef を提供します。カスタム ObjRef にカスタム データを追加するには、GetObjectData をオーバーライドします。カスタム データと、ObjRef.GetObjectData メソッドへのデリゲートを追加して、.NET リモート処理マーシャリング システムのオブジェクト ID 機能を変更します。
逆シリアル化のときに、リモート処理システムは、カスタム ObjRef のオーバーライドされた IObjectReference.GetRealObject を呼び出します。このときには、代わりに基本 ObjRef.GetRealObject メソッドを呼び出す必要があります。これは、基本 ObjRef.GetRealObject がオブジェクト ID を処理し、リモート処理チャネルをセットアップするからです。また、基本 ObjRef.GetRealObject は、オーバーライドされた ProxyAttribute.CreateProxy メソッドを呼び出して、カスタム プロキシをセットアップできるようにします。
マーシャリング解除の方法を決定するには、ObjRef.IsFromThisAppDomain および ObjRef.IsFromThisProcess を使用します。
マーシャリングのときにカスタム ObjRef を提供しない場合には、リモート処理システムが自動的にオブジェクトのマーシャリングおよびマーシャリング解除を行い、カスタム プロキシは呼び出し元のアプリケーション ドメインでは使用されません。
参照
関連項目
RealProxy
ProxyAttribute
RemotingServices
IMessage
IMethodReturnMessage
IMethodCallMessage