52

我有一个我们正在尝试从 32 位迁移到 64 位的应用程序。它是 .NET,使用 x64 标志编译。但是,我们有大量用 FORTRAN 90 编写的 DLL,为 32 位编译。FORTRAN DLL 中的函数相当简单:你把数据放进去,你把数据拉出来;没有任何状态。我们也不会花很多时间在那里,总共可能 3%,但它执行的计算逻辑是无价的。

我可以以某种方式从 64 位代码调用 32 位 DLL 吗?MSDN 建议我不能,期间。我做了一些简单的黑客攻击并验证了这一点。一切都会抛出一个无效的入口点异常。到目前为止,我发现的唯一可能的解决方案是为所有 32 位 DLL 函数创建 COM+ 包装器并从 64 位进程调用 COM。这似乎很让人头疼。我们也可以在 WoW 仿真中运行该过程,但内存上限不会增加,上限约为 1.6gb。

有没有其他方法可以从 64 位 CLR 进程调用 32 位 DLL?

4

3 回答 3

37

您需要将 32 位 dll 加载到单独的 32 位进程中,并让您的 64 位进程通过进程间通信与其通信。我认为没有任何方法可以将 32 位 dll 加载到 64 位进程中。

这里有一篇很好的文章:

从 64 位代码访问 32 位 DLL

于 2008-09-24T17:21:19.613 回答
1

您需要将您的可执行进程编写为 32 位进程(相对于任何 CPU 或 x64),以便将它们与 WoW32 for Vista 一起加载。这将以 32 位仿真模式加载它们,并且您不会遇到入口点问题。你可以让你的库处于 AnyCPU 模式,但你的可执行文件必须编译为 x86。

于 2008-09-24T17:24:42.617 回答
0

如果您不想重新编译现有的 dll,John 的回答是正确的;但是,这也可能是您的选择。

我们的团队目前正在将我们的 x86 FORTRAN 代码迁移到 x64 以增加内存上限。

于 2012-01-06T02:50:05.303 回答