2009-08-09 17 views
11

Me gustaría saber, si tengo una variable, por ejemplo, una cadena, cómo pasar su valor a mi nuevo dominio de aplicación:cómo pasar una variable de un dominio de aplicación a otra

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

Gracias

Respuesta

11

Utilice una de las variaciones de AppDomain.CreateDomain que toma un argumento AppDomainSetup. En el objeto AppDomainSetup, establezca el miembro AppDomainInitializerArguments en la matriz de cadenas que desea pasar al nuevo dominio de la aplicación.

Consulte el código de muestra en http://msdn.microsoft.com/en-us/library/system.appdomainsetup.appdomaininitializerarguments.aspx.

con el código en la pregunta, el cambio podría ser similar (no probado):

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

Gracias. Ahora me gustaría saber cómo devolver la información a mi dominio de aplicación principal. Es decir, devuelve un objeto. ¡Gracias! –

+0

Y otra pregunta. Veo que AppDomainInitializerArguments solo acepta una matriz de cadenas. En este caso, realmente solo quiero cadenas, así que no hay problema, pero ¿y si quisiera otro tipo de datos? ¿Nada que hacer al respecto? –

+0

Los dominios de aplicación no comparten un espacio de memoria de objeto, por lo que pasar objetos alrededor requiere una serialización de algún tipo. Para devolver un objeto, puede DoCallBack en el dominio de aplicación original, si pudiera tenerlo en sus manos (aunque no veo una manera fácil de hacerlo). Alternativamente, puede establecer alguna otra forma de canal entre procesos entre los dominios de aplicaciones, p. un tubo con nombre. –

4

sé que este es un hilo viejo, pero tal vez esto ayudará a otras personas que están investigando el tema.

En this article, el escritor sugiere el uso de dominio de aplicación SetData y GetData métodos para el intercambio básico de objetos de datos que apoyan Mariscal por valor u objeto Mariscal por referencia.

17

Abordar tanto su primera y segunda requisitos (que pasan a través de un valor y recuperar otro valor espalda), aquí es una solución bastante simple:

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

¡Gracias, esta fue la mejor respuesta para mí! – bas

Cuestiones relacionadas