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

时间:2012-01-18 23:23:57

标签: c# .net appdomain

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

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

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

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

  1. 插件DLL需要与主AppDomain中的类进行交互(例如,记录器)。
  2. 发送到插件dll的数据不一定标记为Serializable或从MarshalByRefObj派生。
  3. 在这种情况下,是否存在对应用程序进行分区的常见做法?我们可以采用的最佳解决方案是什么?

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

1 个答案:

答案 0 :(得分:3)

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

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