15 Stimmen

Wie übergebe ich eine Variable von einer App-Domäne an eine andere?

Ich würde gerne wissen, wie ich, wenn ich eine Variable habe, zum Beispiel einen String, ihren Wert an meine neue App-Domäne übergeben kann:

static string _str;

static void Main(string[] args) {
    _str = "abc";
    AppDomain domain = AppDomain.CreateDomain("Domain666");
    domain.DoCallBack(MyNewAppDomainMethod);
    AppDomain.Unload(domain);
    Console.WriteLine("Fertig");
    Console.ReadKey();
}

static void MyNewAppDomainMethod() {
    Console.WriteLine(_str); //möchte, dass dies "abc" ausgibt
}

Danke

27voto

Um sowohl Ihr erstes als auch Ihr zweites Anliegen zu erfüllen (das Durchlaufen eines Werts und das Abrufen eines anderen Werts), hier ist eine recht einfache Lösung:

static void Main(string[] args)
{
    AppDomain domain = AppDomain.CreateDomain("Domain666");
    domain.SetData("str", "abc");
    domain.DoCallBack(MyNewAppDomainMethod);
    string str = domain.GetData("str") as string;
    Debug.Assert(str == "def");
}

static void MyNewAppDomainMethod()
{
    string str = AppDomain.CurrentDomain.GetData("str") as string;
    Debug.Assert(str == "abc");
    AppDomain.CurrentDomain.SetData("str", "def");
}

0 Stimmen

Gute einfache Lösung. Danke. Ich möchte betonen, dass die Rückruffunktion als statisch deklariert werden muss, sonst arbeiten Sie nicht in einem neuen AppDomain. X

14voto

Oren Trutner Punkte 23106

Verwenden Sie eine der Varianten von AppDomain.CreateDomain, die ein AppDomainSetup-Argument akzeptiert. Legen Sie im AppDomainSetup-Objekt das AppDomainInitializerArguments-Mitglied auf das Zeichenfolgenarray fest, das an die neue App-Domäne übergeben werden soll.

Siehe Beispielcode unter http://msdn.microsoft.com/en-us/library/system.appdomainsetup.appdomaininitializerarguments.aspx.

Mit dem Code in der Frage könnte die Änderung wie folgt aussehen (nicht getestet):

static voide Main(string[] args) {
    _str = "abc";

    AppDomainSetup setup = new AppDomainSetup();
    setup.AppDomainInitializer = new AppDomainInitializer(MyNewAppDomainMethod);
    setup.AppDomainInitializerArguments = new string[] { _str };

    AppDomain domain = AppDomain.CreateDomain(
        "Domain666",
        new Evidence(AppDomain.CurrentDomain.Evidence),
        setup);

    Console.WriteLine("Fertig");
    Console.ReadKey();
}

static void MyNewAppDomainMethod(string[] args) {
    ...
}

1 Stimmen

Danke. Jetzt möchte ich wissen, wie ich die Informationen zurück in meine Haupt-Appdomain bekomme. Das heißt, ein Objekt zurückgeben. Danke!

0 Stimmen

Und eine weitere Frage. Ich sehe, dass AppDomainInitializerArguments nur ein Array von Zeichenfolgen akzeptiert. In diesem Fall möchte ich wirklich nur Zeichenfolgen haben, also gibt es kein Problem, aber was ist, wenn ich eine andere Art von Daten haben wollte? Kann man da nichts machen?

0 Stimmen

App-Domains teilen keinen Speicherplatz von Objekten und daher erfordert das Weitergeben von Objekten eine Art Serialisierung. Um ein Objekt zurückzugeben, könnten Sie DoCallBack auf der ursprünglichen App-Domain aufrufen, wenn Sie darauf zugreifen könnten (obwohl ich keinen einfachen Weg sehe, dies zu tun). Alternativ könnten Sie eine andere Form einer Kommunikationsverbindung zwischen den App-Domains herstellen, z. B. eine benannte Pipe.

7voto

Leo Punkte 249

Ich weiß, dass dies ein alter Thread ist, aber vielleicht hilft dies anderen Personen, die das Thema recherchieren.

In diesem Artikel schlägt der Autor vor, die Anwendungsdomänen SetData und GetData Methoden für den einfachen Austausch von Datenobjekten zu verwenden, die Objekte mit Marshal-by-Value oder Marshal-by-Reference unterstützen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X