解决方法.NET应用程序域只能按值传递对象
-
11-07-2019 - |
题
我开发的.NET应用程序,它heavely取决于插件。应用程序本身包含对远程服务器的连接。
最近,我挖入应用程序域和看到它们作为用于从应用程序的其余部分分离所述插件代码的理想解决方案。
然而,有一个很大的缺点,这使得我无法实施托管插件的应用领域。这似乎是没有办法通过参考被传递给连接对象的引用需要另一个应用程序域传递对象。
我希望有人能够给我一个解决方法,所以我可以传递给该对象的引用。
注意:创建代理是不可能的,连接层已经用作因为是自动生成的类的代理
。注2:System.AddIn不能使用,因为它不提供紧凑的框架
解决方案
你试过从 MarshalByRefObject的获得?这是因为它搞砸了你的继承层次痛苦,但我认为这是你想要的。
从文档:
MarshalByRefObject的是基类 为对象进行通信的跨越 应用程序域边界由 交换使用代理的消息。 不从继承的对象 MarshalByRefObject的隐式 按值元帅。当远程 应用程序通过引用元帅 值对象,该对象的副本是 跨应用程序域通过 边界。
MarshalByRefObject的对象是 内直接访问 本地应用程序的边界 域。第一次申请 在远程应用程序域 访问MarshalByRefObject的,代理 被传递给远程应用程序。 在代理后续调用 封回对象驻留 在本地应用程序域。
类型必须从继承 MarshalByRefObject的当类型为 跨应用程序域使用 边界和的状态 对象不能因为被复制 对象的成员是不可用的 应用外域,其中 创建它们。
在我的经验,它可以是相当限制 - 你真的需要跨AppDomain的边界尽量少做,preferrably限制自己只要求基本类型,字符串和两者的阵列操作。这很可能是由于我自己的经验不足与多个应用程序域的工作,但它只是一个警告,这是一个有点雷区。
其他提示
要交谈程序域之间的相同的实例,它必须从继承MarshalByRefObject的。完成这种方法,每一个方法调用的对象(包括属性等)实际上是一个远程调用的其他应用程序域。这是否帮助?
注意MarshalByRefObject
代理的清理是基于租赁清理。总之,如果你不使用的对象将被回收的具体时间。您可以通过覆盖InitializeLifetimeService
返回相匹配,你需要一个租赁物件进行控制。如果返回null
将有效地禁用租赁,然后在的AppDomain被卸载的对象只回收。