次の方法で共有


RealProxy の拡張

このトピックの対象は、既存のアプリケーションとの下位互換性のために残されているレガシ テクノロジに特定されています。新規の開発には、このトピックを適用しないでください。分散アプリケーションは、現在は Windows Communication Foundation (WCF) を使用して開発する必要があります。

プロキシを拡張すると、プロキシ作成プロセスに参加する場合、リモート メソッド呼び出しをマーシャリングする場合、またはオブジェクト 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 オブジェクトを取得できます。この URI はプロキシに格納する必要があります。これは、呼び出しを実際のオブジェクトにディスパッチするために、IMessage.Properties プロパティから返されるコレクション内の "__Uri" エントリを IMessage 実装で設定する必要があるからです。

メッセージを実際のオブジェクトにディスパッチする必要はありません。オブジェクトに対するタスクの一部は Invoke で実行でき、IMethodReturnMessage インターフェイスを実装するオブジェクトを生成して返すことができます。

マーシャリングに参加するには、RealProxy.CreateObjRef をオーバーライドし、ObjRef を拡張するカスタムの ObjRef を提供します。カスタムの ObjRef にカスタム データを追加する場合は、ObjRef.GetObjectData をオーバーライドします。.NET リモート処理マーシャリング システムのオブジェクト ID 機能を変更するには、カスタム データおよび ObjRef.GetObjectData メソッドへのデリゲートを追加します。

逆シリアル化時に、オーバーライドした GetRealObject が、リモート処理システムによってカスタムの ObjRef で呼び出されます。このときに、基本の GetRealObject メソッドにデリゲートする必要があります。これは、この基本のメソッドがオブジェクト ID を処理し、リモート処理チャネルを設定するからです。また、基本メソッドは、オーバーライドされた ProxyAttribute.CreateProxy メソッドを呼び出して、カスタム プロキシを設定できるようにします。

マーシャリングを解除する方法を決定するには、ObjRef.IsFromThisAppDomain および ObjRef.IsFromThisProcess を使用します。

マーシャリング時にカスタムの ObjRef を提供しなかった場合は、リモート処理システムによって自動的にオブジェクトのマーシャリングとマーシャリング解除が行われます。呼び出し元のアプリケーション ドメインでカスタム プロキシが使用されることはありません。

参照

処理手順

カスタム プロキシの技術サンプル

リファレンス

RealProxy
ProxyAttribute
RemotingServices
IMessage
IMethodReturnMessage
IMethodCallMessage

その他のリソース

高度なリモート処理