3

我正在开发一个严重依赖插件的.net 应用程序。应用程序本身包含与远程服务器的连接。

最近我深入研究了应用程序域,并将它们视为将插件代码与应用程序的其余部分隔离的理想解决方案。

然而,有一个很大的缺点使我无法实现用于托管插件的应用程序域。似乎没有办法通过引用另一个应用程序域来传递对象,而另一个应用程序域需要传递对连接对象的引用。

我希望有人能给我一个解决方法,这样我就可以传递对该对象的引用。

注意:创建代理是不可能的,连接层已经充当代理,因为类是自动生成的。

注意 2:不能使用 System.AddIn,因为它在紧凑框架上不可用。

4

3 回答 3

5

您是否尝试过从 MarshalByRefObject派生?这是一个痛苦,它搞砸了你的继承层次结构,但我认为这是你想要的。

从文档:

MarshalByRefObject 是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。不从 MarshalByRefObject 继承的对象是按值隐式编组的。当远程应用程序按值引用编组对象时,该对象的副本将跨应用程序域边界传递。

MarshalByRefObject 对象在本地应用程序域的边界内直接访问。远程应用程序域中的应用程序第一次访问 MarshalByRefObject 时,会将代理传递给远程应用程序。代理上的后续调用被封送回驻留在本地应用程序域中的对象。

当跨应用程序域边界使用类型时,类型必须从 MarshalByRefObject 继承,并且不能复制对象的状态,因为对象的成员在创建它们的应用程序域之外不可用。

以我的经验,它可能是非常有限的——你真的需要尽可能少地跨越 AppDomain 边界,最好将自己限制在只需要原始类型、字符串和两者的数组的操作上。这很可能是由于我自己在使用多个 AppDomain 方面缺乏经验,但这只是一个警告,它有点雷区。

于 2008-11-27T08:30:55.950 回答
1

要在 AppDomain 之间与同一个实例通信,它必须从MarshalByRefObject继承。通过这种方式,对对象的每个方法调用(包括属性等)实际上都是对另一个应用程序域的远程调用。这有帮助吗?

于 2008-11-27T08:31:14.047 回答
1

请注意,MarshalByRefObject代理的清理是根据租约清理的。简而言之,如果您在特定时间内不使用该对象,它将被回收。您可以通过重写InitializeLifetimeService来控制它以返回符合您需要的租约对象。如果您返回null,则有效地禁用了租赁,然后仅在卸载 AppDomain 时才回收该对象。

于 2008-11-27T08:43:13.990 回答