Frage

Ich bin von diese von einem anderen SO Thread beantworten und ich hatte gehofft, jemand kann mir helfen, etwas Licht auf das Konzept leuchten.

Sagen, ich habe eine primäre AppDomain und ein Bündel von Kind AppDomains, die erstellt werden, und durch den primären AppDomain initialisiert. In Pseudo-Code:

Primär 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.
    }
}

Child AppDomain:

class Child : MarshalByRefObject
{
    public void Init(Parent parent)
    {
        parent.Register(new Container<MyInfo>(new MyInfo()));
    }
}

class MyInfo : BasePoco // <- not a MarshalByRefObject!
{
    public MyInfo() { ... }
}

Während der Init (), ein Kind AppDomain instanziiert ein POCO-Objekt, das per definitionem nicht-marshalable ist. Nehmen wir an, auch wir es in dieser Hinsicht nicht ändern können.

Die verknüpfte Antwort deutet darauf hin, dass es in einem Container<T> Verpackung (die selbst ist marshalable) erlauben sollte es übergeben werden zurück zu primären AppDomain. Ich verstehe das, weil es die Proxy ist Instanz Container<MyInfo>, die über bekommt wirklich übergeben.

Was ich nicht verstehe, ist, wie die primären AppDomain möglicherweise die POCO-Instanz in dem Behälter durch das Proxy des Behälters zugreifen . Ich sehe das überladene implizite Cast-Operator in Container<T> und ich verstehe es die enthaltenen POCO-Instanz zurückgibt. Aber das Beispiel ist proxied selbst nicht ist - es ist immer noch in dem Kind AppDomain! So sollte das nicht brechen?

Was ist hier wirklich los?

War es hilfreich?

Lösung

Sobald der Behälter die Instanz zurückgibt in den anderen AppDomain lebt (ob dies über Value-Eigenschaft oder implizite Konvertierung Operator geschieht), wird das Objekt umgeleitet. Wenn es ein MarshalByRefObject ist, wird ein neuer Proxy generiert werden, so dass Sie darauf zugreifen können. Andernfalls wird das Objekt kopiert (vermarshallten nach Wert, serialisiert) in die aktuelle Anwendungsdomäne.

Das einzige, was die Container-Klasse in dieser Frage gezeigt mit helfen kann, wenn Sie einen Proxy auf ein anderes Objekt halten wollen, die nicht gemarshallt werden sollen. Aber in diesem Fall müssen Sie nicht die Eigenschaft Wert zugreifen oder den implizite Konvertierung Operator aus der AppDomain verwenden, wo der Proxy lebt, denn dies ist das Objekt im Container würde dazu führen, gemarshallt werden. Dennoch konnte man den Behälter als Argument in eine Methode für ein Objekt in derselben AppDomain wie das Container-Objekt, also grundsätzlich erlaubt lebt verwenden Sie einen Verweis auf ein nicht-rangierbaren Objekt zu halten (nicht serialisierbar und nicht MarshalByRef oder einen Typen in einer Baugruppe, die auf die AppDomain nicht mit dem Proxy usw. geladen werden können) und es passieren herum wie ein „Griff“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top