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 回答