1

有没有办法在 AppDomain 之间有效地共享或移动 .NET 对象?我意识到 AppDomains 的目的是提供隔离 - 但是我有一个案例,我需要移动一组相对较大的缓存不可变对象,这些对象的计算和创建成本很高。目前,我有一种有效的序列化方法,但速度相当慢。

4

5 回答 5

4

您不能在不序列化对象的情况下跨 AppDomain 移动对象。这就是 AppDomain 的要点——您几乎可以将其视为一个完全独立的进程。

这就是 MarshallByRefObject 发挥作用的地方。它允许您通过远程处理使用来自其他 AppDomain 的对象,而无需跨 AppDomain 边界对其进行序列化。您仍在通过远程处理工作,因此它会比将对象保持在同一个 AppDomain 中要慢,但如果对象很大并且您不经常使用它,与序列化和反序列化相比,这可以节省大量时间它在第二个 AppDomain 中创建一个新副本。

于 2009-06-11T15:30:16.467 回答
2

您可以尝试的一件事是从MarshalByRefObject. 默认情况下,对象在 AppDomain 中按值编组。对于派生自MarshalByRefObject的对象,调用者将获得该对象的代理。所有调用都通过代理,然后编组到对象的应用程序域。这可以减少在两个应用程序域中创建所有对象的副本的需要。

于 2009-06-11T15:27:06.083 回答
1

如何创建一个单独的应用程序空间来管理共享对象,然后使用 Web 服务或远程处理来获取/设置共享数据?您实际上将创建一个中央内存(取决于您存储数据的方式)存储库。

于 2009-06-11T15:28:48.577 回答
0

我相信只有少数“受祝福”的物体能够“流血编组”,即让漂移越过边界(字符串是一个)

如果它们很笨重,而不是试图复制整个东西,那么远程调用应该可以工作(如果没有别的,那就是很大的内存浪费)

于 2009-06-11T15:28:37.750 回答
0

.NET Remoting 是我所知道的最好的方法,尽管我的经验非常有限。如果你想使用它,你需要阅读Ingo Rammer 和 Mario Szpuszta 的Advanced .NET Remoting, Second Edition。当你开始用谷歌搜索 .NET Remoting Ingo 的名字时,会经常出现。我发现这本书现在有点过时了,但很有价值。我还没有尝试过使用大型二进制序列化对象,但使用我一直在使用的较小对象似乎很有效。我确实发现您不能拥有具有 SecureString 属性的对象,除非您想为它们实现自定义序列化/反序列化。

于 2009-06-11T15:30:41.427 回答