我正在开发一个严重依赖插件的.net应用程序。应用程序本身包含与远程服务器的连接。
最近,我深入研究了应用程序域,并将其视为将插件代码与应用程序其余部分隔离开来的理想解决方案。
然而,有一个很大的缺点使我无法实现托管插件的应用程序域。似乎没有办法通过引用传递对象来传递对连接对象的引用所需的另一个应用程序域。
我希望有人可以给我一个解决方法,以便我可以传递对该对象的引用。
注意:创建代理是不可能的,连接层已经充当代理,因为类是自动生成的。
注2:System.AddIn不能使用,因为它在紧凑的框架上不可用。
答案 0 :(得分:5)
您是否尝试过MarshalByRefObject?这是一个痛苦,因为它搞砸了你的继承层次结构,但我认为这就是你想要的。
来自文档:
MarshalByRefObject是基类 用于通信的对象 应用程序域边界 使用代理交换消息。 不继承的对象 MarshalByRefObject是隐含的 按价值编组。当一个遥控器 应用程序引用了一个元帅 value对象,对象的副本是 通过应用程序域传递 边界。
MarshalByRefObject对象是 直接访问 本地应用程序的边界 域。第一次申请 在远程应用程序域中 访问MarshalByRefObject,一个代理 传递给远程应用程序。 对代理的后续调用是 编组回到居住的对象 在本地应用程序域中。
类型必须继承自 当类型为MarshalByRefObject时 跨应用程序域使用 边界和国家的 不能复制对象,因为 对象的成员不可用 在应用程序域之外的地方 他们被创造了。
根据我的经验,它可能非常有限 - 你真的需要在AppDomain边界尽可能少地做,最好将自己限制在只需要原始类型,字符串和两者数组的操作上。这可能是由于我自己在使用多个AppDomain方面缺乏经验,但这只是一个警告,它有点像雷区。
答案 1 :(得分:1)
要与AppDomains之间的同一实例通信,它必须从MarshalByRefObject继承。以这种方式完成,对对象的每个方法调用(包括属性等)实际上是对另一个app-domain的远程调用。这有帮助吗?
答案 2 :(得分:0)
请注意,根据租约清理MarshalByRefObject
代理的清理工作。简而言之,如果您在特定时间内不使用该对象,它将被回收。您可以通过覆盖InitializeLifetimeService
来控制此操作,以返回符合您需要的租约对象。如果您返回null
,则可以有效地禁用租用,然后仅在卸载AppDomain时回收对象。