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

发布于 2024-12-12 14:57:19 字数 151 浏览 3 评论 0原文

我有一个静态类,其中包含一些静态数据。如果从不同的应用程序域访问数据会发生什么?

  1. 每个域都会有一个静态类的副本吗?

  2. 原始类型会被复制吗?

  3. 如果数据可序列化怎么办?

I have a static class which has some static data. What happens to the data if its accessed from different app domain?

  1. Will there a copy of a static class for each domain?

  2. Will the primitive types be copied?

  3. What if the data is serializable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

梦里°也失望 2024-12-19 14:57:19

AppDomain 之间的内存不共享。默认情况下,对象是深度克隆,如果它们是 MarshalByRef 那么它类似于跨 AppDomain 执行调用的远程处理,因此看起来是共享状态。

MarshalByRefObject 是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。不从 MarshalByRefObject 继承的对象按值隐式编组。当远程应用程序引用按值封送对象时,该对象的副本将跨应用程序域边界传递。

我不相信您实际上可以使用 AppDomain 方法调用静态成员,最好的选择是将静态调用包装在实例类中并使用 DoCallback 在其他域中执行该代码并在 MarshalByRef 对象。

请参阅 MSDN 上的示例

The memory between AppDomain's is not shared. By default the objects are a deep clone, if they are MarshalByRef then its similar to remoting where the calls are executed across AppDomain, so it appears that its shared state.

MarshalByRefObject is the base class for objects that communicate across application domain boundaries by exchanging messages using a proxy. Objects that do not inherit from MarshalByRefObject are implicitly marshal by value. When a remote application references a marshal by value object, a copy of the object is passed across application domain boundaries.

I don't believe you can actually invoke static members using the AppDomain methods, your best bet would be to wrap the static calls in an instance class and use DoCallback to execute that code in the other domain and collect the state in a MarshalByRef object.

See the example on MSDN

谁把谁当真 2024-12-19 14:57:19

这篇文章非常完整: Chris Brumme 的博客 > AppDomains(“应用程序域”)

它指出:

无论类型是否与域无关,每个 AppDomain 都必须获得其
自己的静态字段副本。并且类构造函数必须在每个中运行
这些 AppDomains,以确保这些静态字段正确
已初始化。

我同意。

This post is quite complete: Chris Brumme's Weblog > AppDomains ("application domains")

It states:

Whether types are domain-neutral or not, each AppDomain must get its
own copy of static fields. And a class constructor must run in each
of those AppDomains, to ensure that these static fields are properly
initialized.

And I agree.

日记撕了你也走了 2024-12-19 14:57:19

一般来说,您将拥有每个应用程序域的数据副本和单独的初始化。

  1. 是的,每个应用程序域都会有一个静态类的副本,
  2. 不。
  3. 没关系。

如果这是一个具体问题,您可能想分享一个您正在做的事情的示例。有些编组方案会复制数据。

In general you will have a copy of data and separate initialization per appdomain.

  1. Yes, there will be a copy of a static class per app domain
  2. No.
  3. Doesn't matter.

If this is a specific question, you might want to share an example of what you are doing. There are marshalling scenarios that will copy data.

神仙妹妹 2024-12-19 14:57:19

您必须故意在每个应用程序域中加载静态类才能访问它,对于每个应用程序域,它将维护自己的静态数据。

检查这个
AppDomain 中的静态字段

You have to deliberately load the static class in each app domain in order to access it, for each app domain it will maintain its own static data.

check this:
Static Fields in AppDomain

雨夜星沙 2024-12-19 14:57:19

一个简单的程序,打印 0,1,2 和 0,1,2,显示 appdomain 不共享静态数据。

刚刚修改了其中一项: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();
    }
}

A simple program which prints 0,1,2 and 0,1,2 which shows the appdomain doesn't share static data.

Just modified one of: 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();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文