我有一个关于如何构建(新)Firefox扩展和现有C#代码之间的通信的问题。
firefox扩展将使用配置数据并将生成其他数据,因此需要从某处获取配置数据并将其输出保存在某处。数据由现有的C#代码生成/使用,因此我需要决定扩展如何与C#代码交互。
一些相关因素:
我正在考虑的一些选项:
我对(1)的问题是我觉得这很棘手而且不那么容易。但我可能完全错了?我在(2)中看到的主要问题是sqlite的锁定:只有一个进程可以一次写入数据,因此会有一些阻塞。但是,拥有本地数据存储区通常会很好,所以如果性能影响不是太大,这是一个很有吸引力的选择。我不知道(3)是否特别容易或难以......或者采用什么方法来处理协议:自定义或http。
对这些想法或其他建议有何评论?
更新:我计划在javascript中构建扩展而不是c ++
答案 0 :(得分:3)
我个人使用named pipes来进行通信而不是套接字。它们的开销非常低,而且在Windows上非常可靠。
这很容易在C ++和C#中使用。
答案 1 :(得分:1)
如果您需要任何类型的RPC,请使用第一个。否则,您会发现自己正在编写RPC语言,验证,构造/解构等等,只是在本地计算机上有点过分。
如果你有一个非常被动的插件,最好的选择。第三个组件完全解耦了两个进程,这对很多事情都很好,包括如上所述,异步,测试,易于实现等。如果你想做大量的消息传递,可能是一个愚蠢的想法。 / p>
可能是大多数事情的最佳选择。从通过互联网发送内容的角度来看,TCP / IP很不错,但您并不真正想要两个不同的IP地址,或者想要设置Web服务器和可能的端口冲突。管道更有意义,或其他类似的串行通信模型。它解耦得很好,它可以完全异步(TCP / IP是异步的,普通的HTTP不是,管道也是如此),它很容易测试(假设您当然不必编写任何协议),它对代码库不太关心。这意味着明天,如果你的C#后端变成了说,一个Ruby或一个Python,整个事情仍然“正常”。它也比sqlite更好,因为你不必担心用你的插件打包整个库和数据库。
第三个选项的唯一缺点是(一)事物将是异步的但应该是响应和活动的,而sqlite不仅允许事物大部分是被动的,而且不会因为关闭计算机而分阶段一个星期。而且(二)它对RPC来说并不令人惊讶,如果你想再次这样做,你最终会发明自己的协议或处理像SOAP和WSDL这样的东西。
答案 2 :(得分:0)
如果您要使用JavaScript,除了在C ++中编写代理组件之外,我没有看到使用命名管道或其他系统相关通信的其他方法,这将允许您直接访问OS API。另一方面,如果您打算使用TCP / UDP进行IPC,那么对您来说会更容易,因为Firefox提供了可以从JavaScript组件轻松使用的套接字服务。
如果您担心阻塞,可以使用异步套接字通信或线程服务来避免锁定Firefox的GUI,但请注意,许多对象只能从Firefox的主线程访问。
答案 3 :(得分:0)
我选择的选项是#2:使用sqlite db。主要优点是:
显然其中一些是依赖于场景的,所以我绝对不会说这是FF extn和C#服务之间通信的最佳通用选项。
更新:我们最初只使用了一个sqlite数据库,然后想要一些同步通信,以便稍后从FF扩展调用的C#windows服务中公开一个http Web服务。此扩展现在由FF扩展和其他浏览器扩展使用。它很好,它是一个Web服务,因为它使不同语言的不同应用程序易于使用。