私は別の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にあります!だから、これは壊れるべきではありませんか?
ここで実際に何が起こっているのですか?