代码之家  ›  专栏  ›  技术社区  ›  Stormenet

解决方法.NET应用程序域仅按值传递对象

  •  2
  • Stormenet  · 技术社区  · 16 年前

    我正在开发一个非常依赖插件的.NET应用程序。应用程序本身包含到远程服务器的连接。

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

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

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

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

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

    3 回复  |  直到 16 年前
        1
  •  5
  •   Jon Skeet    16 年前

    你有没有试过从 MarshalByRefObject ?这是一个痛苦,因为它破坏了你的继承层次,但我认为这是你想要的。

    来自文档:

    MarshalByRefObject是基类 用于对象之间的通信 应用程序域边界 使用代理交换消息。 不从继承的对象 MarshalByRefObject是隐式的 按值封送。当遥控器 应用程序引用封送方式 值对象,对象的副本是 跨应用程序域传递 边界。

    MarshalByRefObject对象是 直接访问 本地应用程序的边界 领域。第一次申请 在远程应用程序域中 访问MarshalByRefObject、代理 传递到远程应用程序。 随后对代理的调用是 封送回驻留的对象 在本地应用程序域中。

    类型必须继承自 当类型为时MarshalByRefObject 跨应用程序域使用 边界和 不能复制对象,因为 对象的成员不可用 在应用程序域之外,其中 它们是被创造出来的。

    在我的经验中,这可能是相当有限的——您确实需要尽可能少地跨越AppDomain边界,最好将自己限制为只需要两种类型的基元类型、字符串和数组的操作。这很可能是因为我在处理多个应用程序域方面缺乏经验,但这只是一个警告,它有点雷区。

        2
  •  1
  •   Marc Gravell    16 年前

    若要在AppDomain之间与同一实例对话,它必须继承自 MarshalByRefObject .这样,对对象(包括属性等)的每个方法调用实际上都是对其他应用程序域的远程调用。有帮助吗?

        3
  •  0
  •   Brian Rasmussen    16 年前

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

    推荐文章