Вызов Cross AppDomain выполняется в домене вызывающего абонента

Я создаю AppDomain, создаю экземпляр объекта в новом домене и вызываю метод, который возвращает имя текущего AppDomain для обернутого объекта. возвращаемое значение является именем основного домена программы, а не только что созданного. Кстати, код выполняется как UnitTest в VS2010.

Любая идея, почему тест не проходит?

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

person Mehran    schedule 02.02.2012    source источник


Ответы (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;
    }
}

Затем инициализатор/конструктор будет выполняться в удаленном домене, и соответствующие поля, которые он устанавливает, будут копироваться, когда объект пересекает домены.

person cynic    schedule 02.02.2012