2012-02-02 30 views
1

我創建一個AppDomain,在新域中創建一個對象實例並調用一個方法,該方法返回包裝對象上當前AppDomain的名稱。返回的值是主程序域的名稱,而不是新創建的名稱。順便說一下,代碼在VS2010中作爲UnitTest被執行。在調用者域中執行跨AppDomain調用域

任何想法爲什麼測試失敗?

[Serializable] 
    public class DomainHelper 
    { 
     public string GetDomainName() 
     { 
      return AppDomain.CurrentDomain.FriendlyName; 
     } 
    } 


    [TestClass] 
    public class DomainTests 
    { 
     [TestMethod] 
     public void RemoteCall() 
     { 
      var binDir = Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath); 

      const string appDomainName = "TEST"; 
      var x = AppDomain.CreateDomain(appDomainName, null, binDir,null, false); 

      var remoteType = typeof(DomainHelper); 
      var remote = (DomainHelper) x.CreateInstanceAndUnwrap(remoteType.Assembly.FullName, remoteType.FullName); 

      Assert.AreEqual(appDomainName, remote.GetDomainName()); 
     } 
    } 

回答

1

因爲DomainHelper[Serializable]。這意味着當它跨越域時,它會在調用者的域中複製並重新創建,然後在調用者的域中執行.GetDomainName。您可以在構造函數或初始化程序刪除[Serializable]屬性,並有DomainHelperMarshalByRefObject派生,那麼.GetDomainName將在遠程域執行,或者保持[Serializable]屬性和檢索的域名,例如:

[Serializable] 
public class DomainHelper 
{ 
    private readonly string _domainIWasConstructedIn = AppDomain.CurrentDomain.FriendlyName; 

    public string GetDomainName() 
    { 
     return _domainIWasConstructedIn; 
    } 
} 

然後,初始化程序/構造函數將在遠程域中執行,並且設置的相關字段將在對象跨域時被複制。

+0

謝謝,現在有道理! – Mehran 2012-02-02 07:10:19