如何处理跨应用程序域数据交换

lys*_*cid 5 .net c# appdomain

我们正在构建一个.NET应用程序,我们加载外部代码程序集("插件").到目前为止,我们将这些程序集加载到单个(主)应用程序域中.

我们希望能够在加载后卸载它.

为此,我们正在设计一个系统,该系统将创建一个单独的辅助AppDomain来托管插件程序集,以便随意卸载.

我们用这种方法遇到的问题:

  1. 插件DLL需要与主AppDomain(例如,logger)中的类进行交互.
  2. 发送到插件dll的数据不一定标记为Serializable或从MarshalByRefObj派生.

在这种情况下,是否存在对应用程序进行分区的常见做法?我们可以采用的最佳解决方案是什么?

另一个有趣的问题 - 为什么MarshalByRef没有属性并迫使我们从一个对象派生出来?

Sam*_*eff 3

跨 AppDomain 进行通信的最简单方法是使用AppDomain.CreateInstanceAndUnwrap。这将允许您实例化另一个 AppDomain 中的对象并返回该对象的代理。通过代理,您可以有效地跨应用程序域进行方法调用。

如果您当前的类没有扩展,MarshalByRef那么您应该创建一个桥接类来充当中间人。