我应该在同一台机器上运行的Firefox扩展和C#代码之间使用什么IPC方法?

时间:2009-11-21 00:33:15

标签: .net sqlite firefox-addon ipc xpcom

我有一个关于如何构建(新)Firefox扩展和现有C#代码之间的通信的问题。

firefox扩展将使用配置数据并将生成其他数据,因此需要从某处获取配置数据并将其输出保存在某处。数据由现有的C#代码生成/使用,因此我需要决定扩展如何与C#代码交互。

一些相关因素:

  • 它只能在相对受控的企业环境中运行在Windows上。
  • 我在机器上运行了一个Windows服务,用C#构建。
  • 将数据存储在本地数据存储区(如sqlite)中会因其他原因而有用。
  • 数据量很低,例如每隔几分钟就会有10kb的未压缩xml,而且不是很“健谈”。
  • 如果不是完全的话,数据交换大部分都是异步的。
  • 与所有项目一样,我的资源有限,所以想要一个相对容易的选项。
  • 它不一定是超高性能,但不应增加显着的开销。
  • 我打算用javascript构建扩展程序(尽管如果真的有必要可以说服其他人)

我正在考虑的一些选项:

  1. 使用XPCOM到.NET / COM桥
  2. 使用sqlite db:扩展名将从中读取并保存到它。 c#代码将在服务中运行,填充数据库,然后处理服务创建的数据。
  3. 使用TCP套接字在扩展和服务之间进行通信。让服务管理本地数据存储。
  4. 我对(1)的问题是我觉得这很棘手而且不那么容易。但我可能完全错了?我在(2)中看到的主要问题是sqlite的锁定:只有一个进程可以一次写入数据,因此会有一些阻塞。但是,拥有本地数据存储区通常会很好,所以如果性能影响不是太大,这是一个很有吸引力的选择。我不知道(3)是否特别容易或难以......或者采用什么方法来处理协议:自定义或http。

    对这些想法或其他建议有何评论?

    更新:我计划在javascript中构建扩展而不是c ++

4 个答案:

答案 0 :(得分:3)

我个人使用named pipes来进行通信而不是套接字。它们的开销非常低,而且在Windows上非常可靠。

这很容易在C ++和C#中使用。

答案 1 :(得分:1)

  1. 如果您需要任何类型的RPC,请使用第一个。否则,您会发现自己正在编写RPC语言,验证,构造/解构等等,只是在本地计算机上有点过分。

  2. 如果你有一个非常被动的插件,最好的选择。第三个组件完全解耦了两个进程,这对很多事情都很好,包括如上所述,异步,测试,易于实现等。如果你想做大量的消息传递,可能是一个愚蠢的想法。 / p>

  3. 可能是大多数事情的最佳选择。从通过互联网发送内容的角度来看,TCP / IP很不错,但您并不真正想要两个不同的IP地址,或者想要设置Web服务器和可能的端口冲突。管道更有意义,或其他类似的串行通信模型。它解耦得很好,它可以完全异步(TCP / IP是异步的,普通的HTTP不是,管道也是如此),它很容易测试(假设您当然不必编写任何协议),它对代码库不太关心。这意味着明天,如果你的C#后端变成了说,一个Ruby或一个Python,整个事情仍然“正常”。它也比sqlite更好,因为你不必担心用你的插件打包整个库和数据库。

  4. 第三个选项的唯一缺点是(一)事物将是异步的但应该是响应和活动的,而sqlite不仅允许事物大部分是被动的,而且不会因为关闭计算机而分阶段一个星期。而且(二)它对RPC来说并不令人惊讶,如果你想再次这样做,你最终会发明自己的协议或处理像SOAP和WSDL这样的东西。

答案 2 :(得分:0)

如果您要使用JavaScript,除了在C ++中编写代理组件之外,我没有看到使用命名管道或其他系统相关通信的其他方法,这将允许您直接访问OS API。另一方面,如果您打算使用TCP / UDP进行IPC,那么对您来说会更容易,因为Firefox提供了可以从JavaScript组件轻松使用的套接字服务。

如果您担心阻塞,可以使用异步套接字通信或线程服务来避免锁定Firefox的GUI,但请注意,许多对象只能从Firefox的主线程访问。

答案 3 :(得分:0)

我选择的选项是#2:使用sqlite db。主要优点是:

  • 可以在javascript中实现
  • 使用因其他原因而有用的sqlite数据库
  • 异步通信提高了性能:C#代码能够缓存firefox扩展所需的所有信息,而不必按需准备。 FF扩展能够将所有数据保存回sqlite数据库,而不是需要通过C#代码立即处理。
  • 单独的图层提供了一个很好的测试点,例如可以只运行FF代码并验证sqlite中的预期结果,而不需要在FF和C#上运行的测试工具。

显然其中一些是依赖于场景的,所以我绝对不会说这是FF extn和C#服务之间通信的最佳通用选项。

更新:我们最初只使用了一个sqlite数据库,然后想要一些同步通信,以便稍后从FF扩展调用的C#windows服务中公开一个http Web服务。此扩展现在由FF扩展和其他浏览器扩展使用。它很好,它是一个Web服务,因为它使不同语言的不同应用程序易于使用。