2011-08-12 12 views
9

Mam właściwość, której wystąpienie chcę być w innej domenie.CreateInstanceAndUnwrap and Domain

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

To działa dobrze. Ale zakładam, że wszystkie wywołania metody na instancję _loader będą wywoływane w innej domenie (myDomain). Ale po uruchomieniu następującego kodu nadal pisze główną domenę aplikacji.

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("-----------"); 
     } 

Czy to z powodu Unwrap()? Gdzie robię źle?

Rozumiem, że AppDomain tworzy oddzielną pamięć. Potrzebuję moich głównych uruchomień aplikacji, ładuje moduły w różnych AppDomain. Ponieważ główna aplikacja chce również oglądać aktywność modułów i interakcji z obiektami działającymi w oddzielnej domenie, jaki jest najlepszy sposób, aby to osiągnąć.

Odpowiedz

33

Jeśli chcesz rzeczywiście uruchomić kod w innym zespole, musisz uczynić swoją klasę ModuleLoader dziedziczącą po MarshalByRefObject. Jeśli to zrobisz, CreateInstanceAndUnwrap() rzeczywiście zwróci serwer proxy, a wywołanie zostanie wykonane w innej domenie app.

Jeśli tego nie robią, a zamiast oznaczyć klasę jako Serializable (jak sugeruje komunikat wyjątku), CreateInstanceAndUnwrap() stworzy obiekt w drugim AppDomain, szeregować je przenieść postać zserializowaną do oryginalnego AppDomain, deserializowania tam i wywołaj metodę w postaci zserializowanej.

+1

Chciałbym dodać +100 – Igorek