2009-08-09 13 views
11

chciałabym wiedzieć, czy mam zmienną, na przykład, ciąg, jak przekazać swoją wartość do mojej nowej aplikacji domeny:Jak przekazać zmienną z jednej domeny do innej aplikacji

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" 
} 

Dzięki

Odpowiedz

11

Użyj jednej z odmian AppDomain.CreateDomain, która pobiera argument AppDomainSetup. W obiekcie AppDomainSetup ustaw członka AppDomainInitializerArguments na tablicę napisów, którą chcesz przekazać do nowej domeny aplikacji.

Zobacz przykładowy kod pod adresem http://msdn.microsoft.com/en-us/library/system.appdomainsetup.appdomaininitializerarguments.aspx.

Z kodu w pytaniu zmiana może wyglądać (nie testowane):

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

Dzięki. Teraz chciałbym wiedzieć, jak uzyskać informacje z powrotem do mojej głównej domeny aplikacji. Oznacza to, że zwracamy obiekt. Dzięki! –

+0

I kolejne pytanie. Widzę AppDomainInitializerArguments akceptuje tylko tablicę ciągów. W tym przypadku naprawdę chcę tylko ciągi znaków, więc nie ma problemu, ale co, gdybym chciał innego rodzaju danych? Nic z tym nie zrobić? –

+0

Domeny aplikacji nie współużytkują przestrzeni pamięci obiektu, więc przekazywanie obiektów dookoła wymaga jakiejś serializacji. Aby zwrócić obiekt, możesz użyć funkcji DoCallBack na oryginalnym appdomainie, jeśli możesz go zdobyć (nie widzę łatwego sposobu, aby to zrobić). Możesz też ustanowić inną formę kanału międzyprocesowego między domenami aplikacji, np. nazwany potok. –

4

wiem, że jest to stary wątek, ale być może to pomoże innym ludziom, którzy szukają tematu.

W this article, autor proponuje zastosowanie domenę aplikacji SetData i GetData metody podstawowej wymiany obiektów danych, które wspierają marszałka przez wartość lub obiekt marszałek przez odwołanie.

17

Adresowanie Zarówno pierwszy i drugi wymagań (przechodzącego przez wartości i pobieranie inną wartość z powrotem), tutaj jest dość proste rozwiązanie:

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

Dzięki, to była najlepsza odpowiedź dla mnie! – bas

Powiązane problemy