在.NET中跨AppDomains移动对象

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

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

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

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

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

我相信只有少数“祝福”的物体能够“通过流血法造”,即只是让它跨越边界(弦是一个)

远程调用应该有用,如果它们很粗糙而不是试图复制整个事物(如果没有别的话会浪费很多内存)

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