如何适应Ruby使用的非托管C ++ DLL

时间:2013-11-20 17:53:51

标签: c++ ruby-on-rails iis amazon-web-services fastcgi

我需要有关将桌面C ++应用程序转换为Web应用程序的建议。 (这是我的第一个Web应用程序。)桌面应用程序目前有一个C#GUI,但我需要使用的功能都存在于非托管的非线程安全的C ++ DLL中。

网络应用程序使用Rails,并将在Linux服务器上运行。大多数情况下,它需要将一个字符串列表传递给DLL并获得一个返回的winnowed-down列表。 DLL将需要在Windows服务器上运行。它有很长的加载时间,所以我希望它能够持续运行。我需要多个实例来及时处理同时发出的请求。我需要它相当好地扩展。 (如果相关:Windows服务器将在Amazon Web Services上。)

所以我必须确定:(1)如何在Ruby和C ++之间进行交互,以及(2)如何管理并发请求。

Ruby to C ++

我可以使用Ruby Extensions(可能使用Swig或Rb ++来简化)从Ruby调用库。但是当它们在不同的服务器上运行时,它是一个选项吗?

无论如何,由于交互相对简单,我应该只使用HTTP请求。正确?

从我读过的内容来看,听起来像FastCGI是要走的路。我只需要在具有FastCGI接口的进程中包装我的DLL。我还应该考虑其他选择吗?

多个流程

首先我应该澄清:C ++ DLL不是线程安全的。所以我需要服务器产生一个可配置数量的进程,并将请求路由到空闲进程(或将其保留在队列中直到一个进入空闲状态)。

如果我理解正确,FastCGI in general supports thisIIS in particular does too。 (显然IIS不支持多线程FastCGI应用程序,但这对我来说没问题。)

那么这只是配置FastCGI流程管理器的问题吗?

1 个答案:

答案 0 :(得分:0)

查找IIS的ISAPI,然后转到Rails - > 'net - > Windows Server - > IIS - > ISAPI - >你的ISAPI DLL插件 - >您的HTTP网络服务 - >这个DLL。

但是,这是一个很大的难题。你有没有DLL的来源?

如果没有,我会编写一个调用此DLL的Windows测试脚本。然后我会编写涵盖其每一个行为的测试。然后我会开始一个新项目(可能在Ruby中,也许在Gnu C ++中),我会在新项目中传递每个测试。我喜欢称之为“提取算法重构”;结果应该是新的代码,它可以做得更好,更便携。