4

ContextBoundObject から継承されたクラスのインスタンスから作成された {System.Runtime.Remoting.Proxies.__TransparentProxy} 型のランタイム オブジェクトがあります。このクラスは、他のオブジェクトに対してイベントを発生させます。このプロキシ オブジェクトを元のオブジェクトに変換する必要があります。すべてのオブジェクトは、単一システムのデフォルトの AppDomain にあります。

public abstract class ObjectBase : ContextBoundObject, IObjectBase
{
}

public IMessageSink GetObjectSink(MarshalByRefObject o, IMessageSink next)
        {
            _context = (ObjectBase)o;// as ObjectBase; does not give any error but type remains 
/// transparent proxy in VS watch window.
// no property to get the  underlying type of the proxy
             return _aspect;
        }

それらを元のオブジェクトに変換する方法は? 同じメモリで実行している場合にプロキシが作成される理由

4

2 に答える 2

2

RealProxyを呼び出して透過プロキシのインスタンスを取得できますMarshalServices.GetRealProxy()が、サーバー オブジェクト参照を取得するのは難しくなります。これは、デフォルトRealProxyでは、この参照を公開する非パブリック メンバー (保護されたメソッドGetUnwrappedServer()と内部プロパティUnwrappedServerObject) しかないためです。が自分で実装されている場合、RealProxyまたはリフレクションを介して(これを実行するのに十分な信頼がある場合)、それらにアクセスできます。

于 2011-08-14T22:53:57.543 に答える
0

Context にバインドされたオブジェクトへの実際の参照を取得するべきではありません。Evan リフレクション/内部 API を使用して参照を取得すると、予期しない動作が発生します (ルールに違反するため)。google を使用して、コンテキスト オブジェクトの内部をさらに詳しく知ることができます。

実際のアーキテクチャ/設計に問題があると思います。オブジェクトを同時に「アジャイル」と「コンテキスト バインド」にすることはできません。解決策は、大きなオブジェクトを 2 つに分割することです (1 つのコンテキスト バインドと別のアジャイル、およびそれらの間の参照を保持します)。

そのため、「アジャイル」オブジェクト (MArshallByRefObject から継承) の参照を作成 AppDomain に取得すると、プロキシではなく、実際のオブジェクト参照が取得されます。(これは MarshallByRefObject 定義です)

于 2011-08-15T11:40:06.023 に答える