如果跨应用程序域访问类中的静态数据会怎样?

问题描述 投票:6回答:5

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

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

  2. 将复制原始类型吗?

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

.net appdomain
5个回答
6
投票

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

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

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

请参见MarshalByRef上的示例


4
投票

此帖子相当完整:MSDN

状态:

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

我同意。


2
投票

通常,每个应用程序域都有数据副本和单独的初始化。

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

如果这是一个特定的问题,您可能想分享一个示例,说明您在做什么。有编组方案将复制数据。


2
投票

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

检查http://blogs.msdn.com/b/cbrumme/archive/2003/06/01/51466.aspxthis


0
投票

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

仅修改以下一项:Static Fields in AppDomain

Static Fields in AppDomain
© www.soinside.com 2019 - 2024. All rights reserved.