3

我有一个复杂而成熟的科学数据处理项目,它由一个主要用 VB6 编写的纠缠的 COM 服务器网络组成,只使用很少的 UI(没有表单或控件),因为迄今为止大多数普通用户都用它编写简短的 VBA 程序。

我们有两个未来的目标:

  1. 通过 Linux 上的 Web 服务组件创建 Web UI

  2. 逐渐将项目迁移到 D/Python 并远离 Windows 和 VB6

我们正处于设计消息传递框架的阶段,该框架将作为这两个目标的最佳共同提名者。

这些项目执行繁重的数字运算任务,包括运行自定义 R 脚本和 LaTeX/MS Word/Excel 报告。我们需要向广泛的客户公开一些功能,Web UI 似乎是最好的选择。另一方面,随着我们环境中对 Windows 的使用逐渐减少,我们希望最终将我们的项目移植到 Linux,或者至少保持该选项处于开放状态,而不是将自己锁定在特定于 Windows 的技术中。

  • 从这个角度来看,基于 .NET 的自然解决方案是我们首先要避免的。

  • 从 VB6 的角度来看,DCOM/MSRPC 似乎很自然,但这种技术已经过时且不安全。此外,我们希望将项目的 Web 服务部分保留在 Linux 上。

  • 所以最好的选择是在 Linux 上编写 Web 服务部分(例如使用 Python 或 D)。问题仍然存在:如何有效地在 VB6 和 Python(或 D)之间进行通信。很明显,它将是某种网络协议。我们需要的是高效且易于使用的协议,它允许在两方之间传递事件和消息。传输的数据量很小,高延迟并不重要。

    • DCOM/MSRPC似乎可以进行本地通信,但在 Linux 部分真的很容易吗?到目前为止,我们对 Python 的经验很少,并且在 D 中不支持它。
    • 自定义 IP 协议。由于我们的需求很小,这可能会奏效。但它不是重新发明轮子吗?
    • 我们喜欢JSON-RPC的想法,因为我们项目的一部分已经使用了 JSON,并且有用于 Python 和VB6的公开可用的客户端。

我想,我们的任务还有更多可行的解决方案。我们将雇用人员寻求帮助,但在此之前,我们需要知道有哪些可用的技术以及在哪里(谁)寻求帮助。

4

2 回答 2

4

首先想到的是序列化协议,如 Google Protocol Buffers、Thrift、MessagePack、Avro 等。这些协议非常流行,其中一个必须已经在 VB6 中实现。据我所知,除了 Avro 之外,所有的一切都是用 D 实现的,所以根据 VB6 世界的情况,您可能没有多少选择。我的建议是选择其中一个并使用它,或者如果对 VB6 有 REST 支持,那么Linux 端的VibeD可能会为您完成这项工作。

于 2013-11-12T22:51:42.347 回答
1

这是我在 11 月 12 日至 16 日与 Adam D. Ruppe 就这个话题进行的私人谈话,经许可粘贴:

Windows XP TLS 错误再次来袭……它实际上可能是个大问题,这取决于您对避免分配的感觉。

我可以绕过它,但这意味着永远不会加载运行时。如果您使用以下代码进行编译,此处的代码会执行此操作-version=skip_rt_init

所以任何调用它的东西都不起作用 - 没有字符串追加,数组调整大小,大多数火警都出来了,等等。这更像是写 C 而不是写 D。

顺便说一句,问题在于 Windows XP dll 加载器无法处理线程局部静态变量。这里详细解释: http ://www.nynaeve.net/?p=180

如果 dll 与 exe 一起加载,它就可以工作,但是由于 VB 和 JScript LoadLibrary在已经运行的进程中调用,我们遇到了这个问题。

D 默认使用隐式 TLS。我们可以在我们自己的代码中避免它,但在运行时就不是那么容易了。在 D 中调用分配内存等会覆盖父 exe 的内存,导致它无法预测地崩溃。

该问题已在 Windows Vista 中修复,但对 XP 用户没有帮助...

但是,我或多或少地得到了这段代码-version=skip_rt_init。正如您在 com 助手中看到的那样,我跳过了一些障碍来避免大多数分配 - 一些 druntime 和 phobos 工作,只是大部分没有。

dclient.d不过,从好的方面来说,看看chello.dihello.d。相当漂亮的代码!dserver.d不再需要,我能够使所有这些都通用。

大部分乱七八糟的都在comhelpers.d。顺便说一句,向脚本返回值还没有完成,我整天都在和这个线程做斗争。

最重要的是,如果您可以避免任何需要初始化 D 运行时的事情,或者可以使用 win vista +,这将是非常好的。否则,tls 错误可能对您来说是个大问题。

这是zip文件的链接

http://arsdnet.net/dcode/com.zip

检查build.txt我使用的命令行的文件;我不使用 Visual D,但它与此相差无几。

由于该错误,此解决方案在 Win XP 上并不完美,但它可能足以让您使用。


Adam Ryczkowski 写道: 这是一个非常可怕的消息。我直觉地认为,由于 D 允许 C/C++ 的许多低级黑客功能,它可以在任何平台上与 COM 兼容......

是的,问题在于 TLS。你可以让它工作,但由于 druntime 使用默认的线程本地存储,它会出现问题。

AR:除了检查内存分配的来源之外,有没有什么简单的方法可以判断 phobos 和 druntime 的哪一部分可以工作?

我不这么认为。对线程局部变量(主要是模块级全局变量未标记为共享或 gshared)的任何访问都可能是一个问题。

AR:out of proc server 怎么样?内存不应该再有太大问题了,以牺牲执行速度为代价,但我可能会接受。

这是个好主意。我不知道如何做一个 out of proc 服务器,但它不能有太大的不同,并且作为它自己的 exe 可以避免麻烦。

不过,我可能几天内都没有机会自己玩这个了。

AR:非常感谢您的解决方案。如果我将您提供给我的信息发布到 StackExchange,您会同意吗?我想尽可能多地旋转它。

继续,我转向电子邮件,因为堆栈溢出不适合更长时间的讨论,但请随时在此处发布任何内容。


编辑:Adam D. Ruppe 刚才给我发了另一封电子邮件:

我只是偶然发现了一些可能有助于解决 Windows XP 问题的东西:模块 core.sys.windows.dll 有一个功能:

        if( !dll_fixTLS( hInstance, tlsstart, tlsend, tls_callbacks_a ....

它从这里使用:

http://dlang.org/dll.html

在 dll_process_attach 函数中。这可能也适用于我们的问题。我现在正忙于其他事情,但如果你不先做,我可以稍后再试。

于 2013-12-19T20:08:39.143 回答