Экземпляры в отдельных доменах приложений .NET используют один и тот же ссылочный экземпляр - PullRequest
2 голосов
/ 18 марта 2011

Я создаю два экземпляра (через фабрику) в отдельных доменах приложений, но в итоге они используют один и тот же ссылочный экземпляр вместо одного.Ссылочный экземпляр зависит от неуправляемых DLL, может ли это быть причиной?

Как проверить, что два экземпляра действительно работают в отдельных доменах приложения?

        AppDomain appDomain1 = AppDomain.CreateDomain("AD1");
        Factory factory1 = (Factory)appDomain1.CreateInstanceAndUnwrap(typeof(Factory).Assembly.FullName, typeof(Factory).FullName);
        MyClass myInstance1 = factory1.CreateInstance();

        AppDomain appDomain2 = AppDomain.CreateDomain("AD2");
        Factory factory2 = (Factory)appDomain2.CreateInstanceAndUnwrap(typeof(Factory).Assembly.FullName, typeof(Factory).FullName);
        MyClass myInstance2 = factory2.CreateInstance();

MyClass имеет ссылкуодноэлементный класс, который имеет зависимости для кодирования в неуправляемых DLL.myInstance1 и myInstance2 ссылаются на один и тот же экземпляр singleton, даже если они выполняются в разных доменах приложения.

Как это может быть и как я могу убедиться, что они на самом деле являются отдельными доменами приложений?

1 Ответ

2 голосов
/ 26 мая 2011

Я верю, что вы создаете AppDomain в порядке.Но вы не перенаправляете свой код для запуска, просто вызывая свою фабрику.Вам нужно использовать кредит MarshalByRefObject.На этой странице MSDN есть хороший пример: AppDomain.ExecuteAssembly Method .Вот важная часть:

// Create an instance of MarshalbyRefType in the second AppDomain. 
// A proxy to the object is returned.
var mbrt = (MyTypeWhichIsAMarshalByRef) 
    ad2.CreateInstanceAndUnwrap(
        exeAssembly, 
        typeof(MyTypeWhichIsAMarshalByRef).FullName);

// Call a method on the object via the proxy, passing the time
mbrt.SomeMethod(DateTime.Now);

// Unload the second AppDomain. This deletes its object and 
// invalidates the proxy object.
AppDomain.Unload(ad2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...