从 64 位进程调用 32 位代码

发布于 2024-07-06 13:42:11 字数 463 浏览 9 评论 0原文

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

我可以通过某种方式从 64 位代码调用 32 位 DLL 吗? MSDN 表明我不能,就这样。 我已经做了一些简单的黑客攻击并验证了这一点。 一切都会抛出无效的入口点异常。 到目前为止,我发现的唯一可能的解决方案是为所有 32 位 DLL 函数创建 COM+ 包装器,并从 64 位进程调用 COM。 这似乎是一件很头疼的事情。 我们也可以在 WoW 模拟中运行该进程,但内存上限不会增加,上限为 1.6GB 左右。

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

I have an application that we're trying to migrate to 64bit from 32bit. It's .NET, compiled using the x64 flags. However, we have a large number of DLLs written in FORTRAN 90 compiled for 32bit. The functions in the FORTRAN DLLs are fairly simple: you put data in, you pull data out; no state of any sort. We also don't spend a lot of time there, a total of maybe 3%, but the calculation logic it performs is invaluable.

Can I somehow call the 32bit DLLs from 64bit code? MSDN suggests that I can't, period. I've done some simple hacking and verified this. Everything throws an invalid entry point exception. The only possible solution i've found so far is to create COM+ wrappers for all of the 32bit DLL functions and invoke COM from the 64bit process. This seems like quite a headache. We can also run the process in WoW emulation, but then the memory ceiling wouldn't be increased, capping at around 1.6gb.

Is there any other way to call the 32bit DLLs from a 64bit CLR process?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

疯到世界奔溃 2024-07-13 13:42:12

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

这里有一篇非常好的文章:

从 64 位代码访问 32 位 DLL

You'll need to have the 32-bit dll loaded into a separate 32-bit process, and have your 64 bit process communicate with it via interprocess communication. I don't think there is any way a 32-bit dll can be loaded into a 64 bit process otherwise.

There is a pretty good article here:

Accessing 32-bit DLLs from 64-bit code

深陷 2024-07-13 13:42:12

您需要将可执行进程编写为 32 位进程(相对于任何 CPU 或 x64),以便它们能够通过 Vista 的 WoW32 加载。 这将以 32 位模拟模式加载它们,并且您不会遇到入口点问题。 您可以将库保留在 AnyCPU 模式下,但可执行文件必须编译为 x86。

You need to write your executable processes as 32-bit processes (versus Any CPU or x64) so that they'll be loaded with WoW32 for Vista. This will load them in the 32-bit emulation mode and you won't have the entry point problem. You can leave you libraries in AnyCPU mode, but your executables have to be compiled as x86.

苏别ゝ 2024-07-13 13:42:12

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

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

John's answer is correct if you don't want to recompile your existing dlls; however that might be an option for you as well.

Our team is currently migrating our x86 FORTRAN code to x64 to increase the memory ceiling.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文