2009-08-09 4 views
11

ich eine Variable von einer Anwendungsdomäne passieren würde gerne wissen, ob ich eine Variable haben, beispielsweise eine Zeichenfolge, wie ihr Wert auf meine neue Anwendungsdomäne weitergeben müssen:Wie andere

static string _str; 

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

static void MyNewAppDomainMethod() { 
    Console.WriteLine(_str); //want this to print "abc" 
} 

Danke

Antwort

11

Verwenden Sie eine der Variationen von AppDomain.CreateDomain, die ein AppDomainSetup-Argument verwendet. Setzen Sie im AppDomainSetup-Objekt den Member AppDomainInitializerArguments auf das Zeichenfolgenarray, das an die neue Anwendungsdomä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 aussieht (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("Finished"); 
    Console.ReadKey(); 
} 

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

Dank. Jetzt würde ich gerne wissen, wie ich Informationen zu meiner Hauptanwendungsdomäne zurückbekomme. Das heißt, ein Objekt zurückgeben. Vielen Dank! –

+0

Und eine andere Frage. Ich sehe AppDomainInitializerArguments akzeptiert nur ein Array von Zeichenfolgen. In diesem Fall möchte ich wirklich nur Strings, also gibt es kein Problem, aber was ist, wenn ich andere Daten haben wollte? Nichts zu tun? –

+0

App-Domänen teilen keinen Objektspeicherplatz. Daher müssen Objekte durchgelassen werden, um eine Serialisierung zu ermöglichen. Um ein Objekt zurückzugeben, können Sie DoCallBack auf der ursprünglichen appdomain verwenden, wenn Sie es in die Finger bekommen könnten (ich sehe jedoch keinen einfachen Weg dazu). Alternativ könnten Sie eine andere Form von Interprozesskanal zwischen den Anwendungsdomänen einrichten, z. eine Named Pipe. –

4

Ich weiß, dass dies ein alter Thread ist aber vielleicht wird dies andere Menschen hilft, die das Thema forscht.

In this article, schlägt der Verfasser verwendet Anwendungsdomäne SetData und GetData Methoden zum Grunde Austausch von Datenobjekten, die Marshal-by-Wert oder Marshal-by-Referenzobjekt zu unterstützen.

17

sowohl Ihre erste und zweite Anforderungen (die durch einen Wert und einen anderen Wert zurück Abrufen) Adressierung, hier ist eine ganz 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

Danke, das war die beste Antwort für mich! – bas