2011-08-12 9 views
9

Tengo una propiedad cuya instancia quiero pertenecer a otro dominio.CreateInstanceAndUnwrap y dominio

public ModuleLoader Loader 
     { 
      get 
      { 

       if(_loader == null) 
        _loader = (ModuleLoader)myDomain.CreateInstanceAndUnwrap(
           this.GetType().Assembly.FullName, 
           "ModuleLoader", 
           false, 
           System.Reflection.BindingFlags.CreateInstance,         
           null, 
           null, 
           null, 
           null); 
       System.Diagnostics.Debug.WriteLine("Is proxy={0}", 
          RemotingServices.IsTransparentProxy(_loader)); 
           //writes false 
       _loader.Session = this; 
       return _loader; 
      } 
     } 

Esto funciona bien. Pero supongo que todas las llamadas a métodos en la instancia _loader invocarán en otro dominio (myDomain). Pero cuando ejecuto el siguiente código, todavía escribe el dominio principal de la aplicación.

public void LoadModule(string moduleAssembly) 
     { 
      System.Diagnostics.Debug.WriteLine("Is proxy={0}", 
        RemotingServices.IsTransparentProxy(this)); 
      System.Diagnostics.Debug.WriteLine(
          AppDomain.CurrentDomain.FriendlyName); 
      System.Diagnostics.Debug.WriteLine("-----------"); 
     } 

¿Es por Unwrap()? Donde estoy haciendo mal?

Entiendo que AppDomain crea una memoria separada. Lo que necesito es que mi aplicación principal se ejecute, carga módulos en diferentes dominios de aplicaciones. Dado que la aplicación principal también desea ver alguna actividad de módulos e interactuar con objetos que se ejecutan en un dominio independiente, ¿cuál es la mejor manera de lograrlo?

Respuesta

33

Si realmente desea ejecutar el código en el otro ensamblaje, debe hacer que su clase ModuleLoader herede de MarshalByRefObject. Si lo hace, CreateInstanceAndUnwrap() realmente devolverá un proxy y la llamada se ejecutará en el otro dominio de aplicación.

Si no lo hace, y en lugar de marcar la clase como Serializable (como un mensaje de excepción indica), CreateInstanceAndUnwrap() va a crear el objeto en el otro dominio de aplicación, serializarlo, transferir la forma serializada al dominio de aplicación original, deserializar está allí y llama al método en la instancia deserializada.

+1

Desearía poder agregar +100 – Igorek

Cuestiones relacionadas