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

单独的.NET应用程序域中的实例使用相同的引用实例,.net,unmanaged,appdomain,.net,Unmanaged,Appdomain,我在单独的应用程序域中创建了两个实例(通过一个工厂),但它们最终使用的是同一个引用实例,而不是每个引用实例一个。引用的实例依赖于非托管dll,这可能是原因吗 我如何验证两个实例是否在不同的应用程序域中实际运行 AppDomain appDomain1 = AppDomain.CreateDomain("AD1"); Factory factory1 = (Factory)appDomain1.CreateInstanceAndUnwrap(typeof(Facto

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


这是怎么回事?我如何验证它们实际上是独立的应用程序域?

我相信您创建
AppDomain
的方式是可以的。但您并不是通过简单地调用工厂来重定向代码以在那里运行。您需要利用
MarshallByRefObject
。此MSDN页面有一个很好的示例。以下是重要的部分:

        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();
// 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);

你怎么知道它是同一个实例?是否使用了
对象。ReferenceEquals
?创建第二个实例时,它将返回现有的单例,而不是在此应用程序域中创建新的单例。是的,ReferenceEquals返回true。是的,跨应用程序域是.net远程处理的一种形式。如果您没有进行任何封送处理,那么您就没有进行远程处理。如果你不做远程处理,你就不会跨越应用程序域。谢谢!让类从MarshallByRefObject继承使其工作!