2012-02-02 20 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

関連する問題