public static class Class1
{
private static int Value = 0;
public static void IncrementAndPrint()
{
Console.WriteLine(Value++);
}
}
public class Foo : MarshalByRefObject
{
public void Bar()
{
Class1.IncrementAndPrint();
}
}
class Program
{
static void Main(string[] args)
{
var appDomain1 = System.AppDomain.CreateDomain("AppDomain1");
var appDomain2 = System.AppDomain.CreateDomain("AppDomain2");
var class1InAppDomain1 = (Foo)appDomain1.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, "ConsoleApplication1.Foo");
var class1InAppDomain2 = (Foo)appDomain2.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, "ConsoleApplication1.Foo");
class1InAppDomain1.Bar();
class1InAppDomain1.Bar();
class1InAppDomain1.Bar();
class1InAppDomain2.Bar();
class1InAppDomain2.Bar();
class1InAppDomain2.Bar();
}
}
5条答案
按热度按时间a6b3iqyw1#
AppDomain之间的内存不共享。默认情况下,对象是深度克隆,如果它们是MarshalByRef,则类似于远程处理,其中调用是跨AppDomain执行的,因此看起来是其共享状态。
MarshalByRefObject
是通过使用代理交换消息跨应用程序域边界进行通信的对象的基类。不是从MarshalByRefObject
继承的对象将隐式按值封送。当远程应用程序引用按值封送对象时,将跨应用程序域边界传递该对象的副本。我不相信您可以使用AppDomain方法调用静态成员,您最好的办法是将静态调用 Package 在一个示例类中,并使用
DoCallback
在另一个域中执行该代码,并在MarshalByRef
对象中收集状态。请参见MSDN上的示例
kuuvgm7e2#
这篇文章很完整:Chris Brumme's Weblog > AppDomains ("application domains")
其中指出:
无论类型是否与域无关,每个AppDomain都必须有自己的静态字段副本,并且类构造函数必须在每个AppDomain中运行,以确保这些静态字段被正确初始化。
我也同意。
hpxqektj3#
一般来说,每个appdomain都有一个数据副本和单独的初始化。
1.是,每个应用程序域都将有一个静态类的副本
1.没有。
1.没关系。
如果这是一个特定的问题,您可能希望分享一个您正在执行的操作的示例。有些封送处理方案将复制数据。
qlckcl4x4#
您必须在每个应用程序域中特意加载静态类才能访问它,对于每个应用程序域,它都将维护自己的静态数据。
检查this:Static Fields in AppDomain
kmbjn2e35#
一个打印0,1,2和0,1,2的简单程序,这表明appdomain不共享静态数据。
仅修改了以下内容之一:Static Fields in AppDomain