POCO 인스턴스를 다른 앱 도메인에 노출시키기위한 일반 컨테이너 - 어떻게 작동합니까?
-
03-07-2019 - |
문제
나는 흥미가있다 이것 다른 스레드로부터 대답하고, 누군가가 개념에 대해 약간의 빛을 비추도록 도와 줄 수 있기를 바랐습니다.
기본 앱 도메인과 기본 앱 도메인에 의해 생성되고 초기화되는 기본 앱 도메인과 어린이 앱 도메인이 있다고 가정 해 봅시다. 의사 코드 :
기본 앱 도메인 :
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 () 동안, child appdomain은 poco 객체를 인스턴스화하는데, 이는 정의에 따라 말할 수 없다. 또한 우리가 그런 점에서 수정할 수 없다고 가정 해 봅시다.
연결된 답변은 a Container<T>
(그 자체 ~이다 Marshalable)은 그것을 기본 appdomain으로 다시 전달할 수 있어야합니다. 나는 그것이 대리이기 때문에 이것을 이해합니다 Container<MyInfo>
실제로 전달되는 인스턴스.
내가 이해하지 못하는 것은 기본 appdomain이 어떻게 컨테이너의 프록시. 과부하 된 암시 적 캐스트 연산자가 봅니다 Container<T>
포함 된 POCO 인스턴스를 반환한다는 것을 이해합니다. 그러나 그 사례는 그 자체로 프록시되지 않습니다. 여전히 어린이 appdomain에 있습니다! 그래서, 이것이 깨지지 말아야합니까?
여기서 실제로 무슨 일이 일어나고 있습니까?
해결책
컨테이너가 다른 AppDomain (값 속성 또는 암시 적 변환 연산자를 통해 발생하는 경우)에 거주하는 인스턴스를 반환하자마자 객체가 마샬링됩니다. MarshalbyRefobject 인 경우 새 프록시가 생성되어 액세스 할 수 있습니다. 그렇지 않으면 객체가 현재 응용 프로그램 영역에 복사 (값으로 마샬링)됩니다.
그 질문에 표시된 컨테이너 클래스가 도움이 될 수있는 유일한 것은 마샬링되어서는 안되는 다른 물체에 프록시를 유지하려는 경우입니다. 그러나이 경우 값 속성에 액세스하거나 프록시가 사는 AppDomain의 암시 적 변환 연산자를 사용해서는 안됩니다. 컨테이너의 객체가 마샬링되기 때문입니다. 그럼에도 불구하고 컨테이너를 컨테이너 객체와 동일한 appdomain에 거주하는 객체의 메소드에 대한 인수로 사용할 수 있으므로 기본적으로 비공개 객체 (직렬화 할 수없고 마샬 비어프가 아닌 유형 또는 유형에 대한 참조를 유지할 수 있습니다. 프록시 등으로 AppDomain에로드 할 수없는 어셈블리에서 "핸들"처럼 전달합니다.