【问题标题】:Workaround .net application domain only passing objects by value解决方法 .net 应用程序域仅按值传递对象
【发布时间】:2008-11-27 16:43:13
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# appdomain marshalbyrefobject


    【解决方案1】:

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

    来自文档:

    MarshalByRefObject 是基类 对于跨越通信的对象 应用程序域边界 使用代理交换消息。 不继承自的对象 MarshalByRefObject 是隐式的 按价值编组。当一个遥控器 应用程序引用元帅 值对象,该对象的副本是 跨应用程序域传递 边界。

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

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

    根据我的经验,它可能会受到很大限制 - 您确实需要尽可能少地跨越 AppDomain 边界,最好将自己限制在只需要原始类型、字符串和数组两者的操作上。这很可能是由于我自己在处理多个 AppDomain 方面缺乏经验,但这只是一个警告,它有点雷区。

    【讨论】:

    • 我看到它会破坏我的继承层次结构。我去看看,谢谢。
    • 嗯,我试过了,看起来很有希望。但是,大多数插件都返回一个需要托管在主应用程序中的用户控件,这看起来真的很棘手:s
    • 是的,做跨域用户界面的东西真的很难。你看过 .NET 3.5 System.AddIn 的东西吗?我不知道它是否对你有用,但可能值得一看...blogs.msdn.com/zifengh
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这很有帮助,我正在使用一个应用程序域,我的 MarshallByRefObject 在我完成之前就被清理了!
      猜你喜欢
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      相关资源
      最近更新 更多