1

私は別のSOスレッドからのこの回答に興味を持っており、誰かが私にコンセプトに光を当てるのを手伝ってくれることを望んでいました。

プライマリAppDomainと、プライマリAppDomainによって作成および初期化される子AppDomainの束があるとします。擬似コードの場合:

プライマリAppDomain:

class Parent
{
    public void InitChildren(IList<ChildInfo> children)
    {
        foreach (var childInfo in children)
        {
            var ad = CreateNewChildAppDomain();
            var child = (Child)ad.CreateInstanceAndUnwrap(typeof(Child));
            child.Init(this);
        }
    }

    public void Register(BasePoco info)
    {
        // Do something with info.
    }
}

子AppDomain:

class Child : MarshalByRefObject
{
    public void Init(Parent parent)
    {
        parent.Register(new Container<MyInfo>(new MyInfo()));
    }
}

class MyInfo : BasePoco // <- not a MarshalByRefObject!
{
    public MyInfo() { ... }
}

Init()中に、子AppDomainはPOCOオブジェクトをインスタンス化します。これは、定義上、マーシャリングできません。また、その点で変更できないと仮定しましょう。

リンクされた回答は、それをContainer<T>(それ自体マーシャリング可能である)でラップすると、プライマリAppDomainに戻すことができるようにする必要があることを示唆しています。Container<MyInfo>実際に渡されるのはインスタンスへのプロキシであるため、これを理解しています。

私が理解していないのは、プライマリAppDomainがコンテナのプロキシを介してコンテナ内のPOCOインスタンスにアクセスする方法です。オーバーロードされた暗黙のキャスト演算子が表示されContainer<T>、含まれているPOCOインスタンスが返されることを理解しています。しかし、そのインスタンスはそれ自体がプロキシされていません-それはまだ子AppDomainにあります!だから、これは壊れるべきではありませんか?

ここで実際に何が起こっているのですか?

4

1 に答える 1

1

コンテナーが他の AppDomain に存在するインスタンスを返すとすぐに (これが Value プロパティまたは暗黙的な変換演算子を介して発生する場合)、オブジェクトはマーシャリングされます。MarshalByRefObject の場合は、アクセスできるように新しいプロキシが生成されます。それ以外の場合、オブジェクトは現在のアプリケーション ドメインにコピー (値でマーシャリング、シリアル化) されます。

その質問に示されている Container クラスが役立つ唯一のことは、マーシャリングされるべきではない別のオブジェクトへのプロキシを保持したい場合です。ただし、この場合、コンテナー内のオブジェクトがマーシャリングされるため、Value プロパティにアクセスしたり、プロキシが存在する AppDomain から暗黙的な変換演算子を使用したりしないでください。それでも、Container オブジェクトと同じ AppDomain に存在するオブジェクトのメソッドへの引数としてコンテナーを使用できるため、基本的に、マーシャリング不可能なオブジェクト (シリアライズ可能ではなく、MarshalByRef ではない、または型のオブジェクト) への参照を保持できます。プロキシなどを使用して AppDomain にロードできないアセンブリ内で)、それを「ハンドル」のように渡します。

于 2009-04-30T13:31:03.823 に答える