我对另一个 SO 线程的这个答案很感兴趣,我希望有人可以帮助我阐明这个概念。
假设我有一个主 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.
}
}
子应用域:
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 中!那么,这不应该中断吗?
这里到底发生了什么?