1

AppDomain を作成し、新しいドメインにオブジェクトのインスタンスを作成して、ラップされたオブジェクトで現在の AppDomain の名前を返すメソッドを呼び出します。返される値はメイン プログラム ドメインの名前であり、新しく作成されたドメインではありません。ちなみに、コードはVS2010でUnitTestとして実行されています。

テストが失敗する理由はありますか?

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

1 に答える 1

1

DomainHelperですので[Serializable]。つまり、ドメインを越えると、呼び出し元のドメインでコピーおよび再作成され、その後、呼び出し元のドメインで.GetDomainName実行されます。[Serializable]次のように、属性を削除してDomainHelperから派生さMarshalByRefObject.GetDomainName、リモート ドメインで実行するか、[Serializable]属性を保持してコンストラクタまたはイニシャライザでドメイン名を取得することができます。

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

    public string GetDomainName()
    {
        return _domainIWasConstructedIn;
    }
}

次に、イニシャライザ/コンストラクタがリモート ドメインで実行され、設定された関連フィールドが、オブジェクトがドメインをまたぐときにコピーされます。

于 2012-02-02T07:06:30.623 に答える