.net 如果跨应用程序域访问类中的静态数据,会发生什么情况?

qqrboqgw  于 2023-02-06  发布在  .NET
关注(0)|答案(5)|浏览(158)

我有一个静态类,其中有一些静态数据。如果它从不同的应用程序域访问的数据会发生什么?
1.每个域都有一个静态类的副本吗?
1.是否复制基元类型?
1.如果数据是可序列化的呢?

a6b3iqyw

a6b3iqyw1#

AppDomain之间的内存不共享。默认情况下,对象是深度克隆,如果它们是MarshalByRef,则类似于远程处理,其中调用是跨AppDomain执行的,因此看起来是其共享状态。
MarshalByRefObject是通过使用代理交换消息跨应用程序域边界进行通信的对象的基类。不是从MarshalByRefObject继承的对象将隐式按值封送。当远程应用程序引用按值封送对象时,将跨应用程序域边界传递该对象的副本。
我不相信您可以使用AppDomain方法调用静态成员,您最好的办法是将静态调用 Package 在一个示例类中,并使用DoCallback在另一个域中执行该代码,并在MarshalByRef对象中收集状态。
请参见MSDN上的示例

kuuvgm7e

kuuvgm7e2#

这篇文章很完整:Chris Brumme's Weblog > AppDomains ("application domains")
其中指出:
无论类型是否与域无关,每个AppDomain都必须有自己的静态字段副本,并且类构造函数必须在每个AppDomain中运行,以确保这些静态字段被正确初始化。
我也同意。

hpxqektj

hpxqektj3#

一般来说,每个appdomain都有一个数据副本和单独的初始化。
1.是,每个应用程序域都将有一个静态类的副本
1.没有。
1.没关系。
如果这是一个特定的问题,您可能希望分享一个您正在执行的操作的示例。有些封送处理方案将复制数据。

qlckcl4x

qlckcl4x4#

您必须在每个应用程序域中特意加载静态类才能访问它,对于每个应用程序域,它都将维护自己的静态数据。
检查thisStatic Fields in AppDomain

kmbjn2e3

kmbjn2e35#

一个打印0,1,2和0,1,2的简单程序,这表明appdomain不共享静态数据。
仅修改了以下内容之一:Static Fields in AppDomain

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

相关问题