我在单独的应用程序域中创建了两个实例(通过工厂),但最终使用相同的引用实例而不是每个实例。引用的实例依赖于非托管的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引用相同的单例实例,即使它们在单独的应用程序域中执行。
这怎么可能,如何验证它们实际上是独立的应用程序域?
答案 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);