Я заинтригован этим ответом из другой SO-темы, и я надеялся, что кто-нибудь может помочь мне пролить свет на эту концепцию.
Допустим, у меня есть основной домен приложений и несколько дочерних доменов приложений, которые создаются и инициализируются основным доменом приложений. В псевдокоде:
Основной домен приложения:
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.
}
}
дочерний домен приложения:
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. Но этот экземпляр не проксируется сам по себе - он все еще находится в дочернем домене приложения! Итак, не должен ли этот перерыв?
Что на самом деле здесь происходит?