Перекрестный вызов AppDomain выполняется в Домене вызывающего абонента - PullRequest
1 голос
/ 02 февраля 2012

Я создаю 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());
        }
    }

1 Ответ

1 голос
/ 02 февраля 2012

Потому что DomainHelper это [Serializable]. Это означает, что когда он пересекает домены, он копируется и воссоздается в домене вызывающего, а затем .GetDomainName выполняется в домене вызывающего. Вы можете либо удалить атрибут [Serializable] и получить DomainHelper из MarshalByRefObject, тогда .GetDomainName будет выполняться в удаленном домене, либо оставить атрибут [Serializable] и получить имя домена в конструкторе или инициализатор, вот так:

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

    public string GetDomainName()
    {
        return _domainIWasConstructedIn;
    }
}

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

...