如果跨应用程序域访问类中的静态数据,会发生什么情况?
我有一个静态类,其中包含一些静态数据。如果从不同的应用程序域访问数据会发生什么?
每个域都会有一个静态类的副本吗?
原始类型会被复制吗?
如果数据可序列化怎么办?
I have a static class which has some static data. What happens to the data if its accessed from different app domain?
Will there a copy of a static class for each domain?
Will the primitive types be copied?
What if the data is serializable?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
AppDomain 之间的内存不共享。默认情况下,对象是深度克隆,如果它们是 MarshalByRef 那么它类似于跨 AppDomain 执行调用的远程处理,因此看起来是共享状态。
我不相信您实际上可以使用 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.
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 aMarshalByRef
object.See the example on MSDN
这篇文章非常完整: Chris Brumme 的博客 > AppDomains(“应用程序域”)
它指出:
我同意。
This post is quite complete: Chris Brumme's Weblog > AppDomains ("application domains")
It states:
And I agree.
一般来说,您将拥有每个应用程序域的数据副本和单独的初始化。
如果这是一个具体问题,您可能想分享一个您正在做的事情的示例。有些编组方案会复制数据。
In general you will have a copy of data and separate initialization per appdomain.
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.
您必须故意在每个应用程序域中加载静态类才能访问它,对于每个应用程序域,它将维护自己的静态数据。
检查这个:
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
一个简单的程序,打印 0,1,2 和 0,1,2,显示 appdomain 不共享静态数据。
刚刚修改了其中一项:AppDomain 中的静态字段
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