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

MarshalByRefObject的创造性使用

  •  1
  • IAbstract  · 技术社区  · 16 年前

    我一直在努力弄清楚一些事情。所以,我正在寻找建议和研究材料(通过链接)。下面是场景:

    我们有一个库(比如,commonlib),其中包含一些其他应用程序(比如,appa、appb、appc等等)所需的资源。现在,它当前的工作方式是AppA实例,检查特定端口是否可用。如果不是,那么它将启动commonlib(“嘿,醒醒”)并启动服务。然后阿帕很开心,我们走了。

    现在,我已经做了很多关于远程处理的研究,渠道和我得出的结论是,我正在启动一个基于“遗留”技术的应用程序。嗯……我不喜欢那样。老实说,WCF的开销比我们需要的要大得多,而且还没有在Mono中完全实现。我们的目标是多平台兼容性(Windows、Mono、Linux),因此我们正在研究所有选项。

    远程处理的想法一开始是因为我们希望CommonLib是一个有保证的单实例(据我所知,单实例基本上只保证在给定的AppDomain中是单实例—如果我错了,请随时纠正我)。不管怎样,我意识到远程处理的威力,决定开始一些实验性的实现。我已经成功地首次使用了MarshalByRefObject。但是,我担心这个遗留技术的持续实施。

    因此,有了这些……我正在考虑如何实现CommonLib(作为主机应用程序),并且在不远程处理的情况下,通过流、标准TCP套接字或其他方式实现MarshalByRefObject。我想的是,不要通过安装appa来运行commonlib,只需实现commonlib作为基本应用程序。然后,选择要在CommonLib中实例化的应用程序(实际上只是一个“hosted.dll”)。然后,CommonLib会将该.dll连同宿主应用程序使用的任何自定义控件加载到CommonLib框架中。除了这个想法,我现在放弃了commonlib必须是一个真正的singleton的要求。

    所以……这是我们场景的一个细节。同样,我的问题实际上是两个部分:(a)我应该研究什么技术;(b)我需要关心远程处理技术的遗留状态吗?

    任何其他建议、评论或问题都是不受欢迎的。

    更新1:我从 this snippet . 这将允许我加载一个包含已安装的应用程序(或插件)列表的文件(或脚本)。我可以创建XML或二进制格式的文件。安装新应用程序时,可以添加文件和路径。嗯…我不需要使用MarshalByRefObject。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Marc Gravell    16 年前

    而wcf可能不是 作为完成 在Mono中,Mono2.6提供了Silverlight/Mowhole所需的一切,因此基于WCF的实现应该是完全可行的。只要您不尝试任何异国情调(不同的传输、检查器等),就应该能够提供一个在Windows/Mono/etc之间可靠的RPC堆栈。

    WCF和远程处理的关键区别在于 使用 -远程处理是基于一个假装处于不同端的对象,其中WCF基于一个服务;重点是,您应该将交互基于离散方法(而不是访问属性等),这也有助于在跨越边界时将其显式化。

    另一种选择是编写一个非常基本的socket服务器;非常轻量,您可以使用类似protobuf net的东西来提供可移植(跨平台)序列化程序实现(您不应该真正信任 BinaryFormatter 在两者之间-是…弗拉基)

    简言之-我不会在周围建房子 MarshalByRefObject 完全 ;我将编写一个服务层,类似于:

    interface IMyService {
        void Method1();
        int Method2(string s);
    }
    

    把这些细节从呼叫者身上抽象出来。如果你最终使用了wcf,那就是 全部的 您需要;对于现有的远程处理支持,我将编写一个 IMyService 实施 包封 (私下)整个 MarshalByRefObject 故事。同样,如果我写了一个套接字服务器。

        2
  •  1
  •   Max Strini    16 年前

    我不确定.NET远程处理是否被WCF废弃。我认为它们有一些不同的用例;WCF(故意)没有“引用封送”的概念,因为它是为分布式和(相对)松散耦合的应用程序设计的,这些应用程序可能需要避免由于延迟等原因而产生的聊天协议。如果您的组件是自然紧密耦合的,则延迟将很低,但性能需要很高。,保留丰富的.NET类型很重要,等等,那么远程处理可能仍然是一个很好的适合。不管怎样,我不会担心成为“遗留”技术,至少在windows/.net上,如果它们得到了相当多的使用量,那么它们有一种在周围停留相当长时间的方式。远程处理仍然存在于.NET的最新(4.0)版本中。

    所有这些都不是说远程处理是必要的 最适合你的情况…