Можно ли определить, запущен ли объект в другом домене приложений? - PullRequest
7 голосов
/ 09 марта 2010

Я хочу знать, могу ли я сказать, в каком домене приложения был создан объект. Это для модульного теста, но также полезно для общего знания. У меня есть следующие фрагменты кода (это пример кода для иллюстрации).

public Foo Create()
{
    AppDomainSetup appDomainSetup = 
        new AppDomainSet { ApplicationBase = @"z:\SomePath" }

    AppDomain appDomain = 
                  AppDomain.CreateDomain("DomainName", null, appDomainSetup);

    return (Foo) appDomain.CreateInstanceAndUnwrap("MyAssembly", "MyClass");
}

Я тогда звоню

Foo myFoo = Create();

Что я хотел бы сделать, так это выяснить, какой метод AppDomain на myFoo будет вызываться, чтобы проверить, что метод Create действительно создал новый AppDomain. Я понимаю, что могу добавить метод на Foo, как

public class Foo
{
    public string appDomainName 
    { 
        get { return AppDomain.CurrentDomain.FriendlyName; } 
    }
}

Это даст мне домен приложения, в котором работает Foo. Я не думаю, что это элегантное решение только для модульного теста. Было бы здорово, если бы кто-то мог помочь определить такой метод, как.

public string GetAppDomainNameWithDotNetWitchcraft(Foo myFoo)
{
    // Insert voodoo here.
}

EDIT: Спасибо за отзывы и комментарии. На вопрос, который я задал, был дан ответ, и комментарии помогли мне понять, в чем дело. Чего я действительно хотел добиться, так это проверить, что новый домен приложений создан.

1 Ответ

5 голосов
/ 09 марта 2010

Ну, вы можете сделать немного Spelunking через Remoting / Reflection, предполагая, что вы работаете в полном доверии. Обратите внимание, что вам нужно получить доступ к частной собственности, и это предполагает, что единственное, что он может найти, это удаленное взаимодействие из-за доменов нескольких приложений:

    var a = Create();
    if (System.Runtime.Remoting.RemotingServices.IsTransparentProxy(a))
    {
        var c = System.Runtime.Remoting.RemotingServices.GetObjRefForProxy(a);
        var ad = c.ChannelInfo.ChannelData[0];
        var propDomainId = ad.GetType().GetProperty("DomainID", BindingFlags.NonPublic | BindingFlags.Instance);
        var DomainID = propDomainId.GetValue(ad,null);
    }

Затем вы можете сравнить этот идентификатор домена с вашим собственным, чтобы узнать, находится ли он в вашем домене. Напоминаем, что вряд ли вы введете оператор if, если он равен в вашем домене (пытаясь придумать обстоятельства, когда у вас будет прозрачный прокси для объекта в вашем собственном домене).

...