2009-08-09 18 views
8

tengo el siguiente código: "trabajar"Pasar valores de la espalda y AppDomains sucesivamente

public class AppDomainArgs : MarshalByRefObject { 
     public string myString; 
    } 

    static AppDomainArgs ada = new AppDomainArgs() { myString = "abc" }; 

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

    static void MyNewAppDomainMethod() { 
     ada.myString = "working!"; 
    } 

pensé hacer esto haría que mi ada.myString tiene en el dominio de aplicación principal, pero no es así. Pensé que al heredar de MarshalByRefObject, cualquier cambio realizado en el segundo dominio de aplicación se reflejaría también en el original (¡pensé que esto sería solo un proxy para el objeto real en el dominio de aplicación principal!)?

Gracias

+0

(añade un poco de explicación como un comentario) –

Respuesta

17

El problema en su código es que en realidad nunca pasa el objeto sobre el límite; por lo tanto, tiene dos instanciasada, una en cada aplicación de dominio (el inicializador de campo estático se ejecuta en ambos dominios de aplicación). Usted tendrá que pasar la instancia sobre el límite para la MarshalByRefObject mágica para poner en

Por ejemplo:.

using System; 
class MyBoundaryObject : MarshalByRefObject { 
    public void SomeMethod(AppDomainArgs ada) { 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + "; executing"); 
     ada.myString = "working!"; 
    } 
} 
public class AppDomainArgs : MarshalByRefObject { 
    public string myString { get; set; } 
} 
static class Program { 
    static void Main() { 
     AppDomain domain = AppDomain.CreateDomain("Domain666"); 
     MyBoundaryObject boundary = (MyBoundaryObject) 
       domain.CreateInstanceAndUnwrap(
       typeof(MyBoundaryObject).Assembly.FullName, 
       typeof(MyBoundaryObject).FullName); 

     AppDomainArgs ada = new AppDomainArgs(); 
     ada.myString = "abc"; 
     Console.WriteLine("Before: " + ada.myString); 
     boundary.SomeMethod(ada); 
     Console.WriteLine("After: " + ada.myString);   
     Console.ReadKey(); 
     AppDomain.Unload(domain); 
    } 
} 
+0

¿Cómo sería eso? : o –

+2

No entiendo "¿Cómo sería eso?", pero si quiere un ejemplo; adicional. –

+0

¡Solo ejecuto su código y hace lo que estoy buscando! ¡Gracias! Ahora lo analizaré cuidadosamente para entender qué está ocurriendo allí. –

Cuestiones relacionadas