2009-08-09 11 views
11

Mi piacerebbe sapere, se ho una variabile, ad esempio, una stringa, come passare il suo valore al mio nuovo dominio applicazione:Come passare una variabile da un dominio ad un altro app

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

Grazie

risposta

11

Utilizzare una delle varianti di AppDomain.CreateDomain che accetta un argomento AppDomainSetup. Nell'oggetto AppDomainSetup, impostare il membro AppDomainInitializerArguments sull'array di stringhe che si desidera passare al nuovo dominio dell'app.

Vedere codice di esempio http://msdn.microsoft.com/en-us/library/system.appdomainsetup.appdomaininitializerarguments.aspx.

Con il codice in questione, il cambiamento potrebbe essere simile (non testato):

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

Grazie. Ora mi piacerebbe sapere come ottenere informazioni sul mio appdomain principale. Cioè, restituire un oggetto. Grazie! –

+0

E un'altra domanda. Vedo AppDomainInitializerArguments accetta solo un array di stringhe. In questo caso voglio solo stringhe, quindi non c'è alcun problema, ma se volessi un altro tipo di dati? Niente da fare al riguardo? –

+0

I domini di app non condividono lo spazio di memoria di un oggetto e pertanto il passaggio degli oggetti richiede la serializzazione di qualche tipo. Per restituire un oggetto, potresti eseguire DoCallBack sull'appodominio originale, se riuscissi a metterlo tra le mani (non vedo però un modo semplice per farlo). In alternativa, potresti stabilire un'altra forma di canale interprocessuale tra i domini, ad es. una pipa con nome. –

4

So che questo è un vecchio thread, ma forse questo aiuterà altre persone che stanno ricercando il soggetto.

In this article, lo scrittore suggerisce di usare dominio applicazione SetData e GetData metodi per lo scambio di oggetti di base di dati che supportano marshal-by-value o oggetto marshal per riferimento.

17

Affrontare sia il vostro primo e secondo requisiti (che passano attraverso un valore e il recupero un altro valore indietro), ecco una soluzione molto semplice:

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

Grazie, questa è stata la migliore risposta per me! – bas

Problemi correlati