POCO 인스턴스를 다른 앱 도메인에 노출시키기위한 일반 컨테이너 - 어떻게 작동합니까?

StackOverflow https://stackoverflow.com/questions/806744

문제

나는 흥미가있다 이것 다른 스레드로부터 대답하고, 누군가가 개념에 대해 약간의 빛을 비추도록 도와 줄 수 있기를 바랐습니다.

기본 앱 도메인과 기본 앱 도메인에 의해 생성되고 초기화되는 기본 앱 도메인과 어린이 앱 도메인이 있다고 가정 해 봅시다. 의사 코드 :

기본 앱 도메인 :

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에로드 할 수없는 어셈블리에서 "핸들"처럼 전달합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top