如果在应用程序域中访问静态数据,会发生什么?

Dre*_*mer 6 .net appdomain

我有一个静态类,它有一些静态数据.如果数据从不同的应用域访问,会发生什么?

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

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

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

Pau*_*yng 6

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

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

我不相信您实际上可以使用AppDomain方法调用静态成员,最好的办法是将静态调用包装在实例类中,并用于DoCallback在另一个域中执行该代码并在MarshalByRef对象中收集状态.

请参阅MSDN上的示例


dri*_*iis 2

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

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

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