2011-08-12 19 views
9

我有一個屬性的實例,我想在其他域。CreateInstanceAndUnwrap和域

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

這工作正常。但我假設_loader實例上的所有方法調用都會在其他域(myDomain)中調用。但是當我運行下面的代碼時,它仍然寫入主應用程序域。

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

是因爲Unwrap()?我在哪裏做錯了?

我知道AppDomain會創建單獨的內存。我需要的是我的主應用程序運行,它將模塊加載到不同的AppDomain中。由於主應用程序也希望觀察模塊的某些活動並與在單獨域中運行的對象進行交易,因此實現它的最佳方式是什麼。

回答

33

如果您想實際運行其他程序集中的代碼,則需要使ModuleLoader類從MarshalByRefObject繼承。如果你這樣做,CreateInstanceAndUnwrap()實際上會返回一個代理,並且調用將在另一個appdomain中執行。

如果你不這樣做,而是將類標記爲Serializable(作爲例外消息提示),CreateInstanceAndUnwrap()將在其他AppDomain中創建對象,序列化,序列化形式轉移到原來的應用程序域,反序列化它在那裏並調用反序列化實例上的方法。

+1

希望我可以加+100 – Igorek