单独的.NET应用程序域中的实例使用相同的引用实例

时间:2011-03-18 09:50:31

标签: .net unmanaged appdomain

我在单独的应用程序域中创建了两个实例(通过工厂),但最终使用相同的引用实例而不是每个实例。引用的实例依赖于非托管的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引用相同的单例实例,即使它们在单独的应用程序域中执行。

这怎么可能,如何验证它们实际上是独立的应用程序域?

1 个答案:

答案 0 :(得分:2)

我相信你创建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);