从64位进程调用32位代码

55

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

我能否以某种方式从64位代码调用32位DLL?MSDN建议我根本不行。我已经进行了一些简单的黑客攻击并进行了验证。所有内容都会抛出无效的入口点异常。目前我找到的唯一可能的解决方案是为所有32位DLL函数创建COM+包装器,并从64位进程调用COM。这似乎很麻烦。我们也可以在WoW仿真中运行进程,但是内存上限不会增加,仅限于约1.6 GB。

是否有其他方法从64位CLR进程调用32位DLL?


3
可能是 Access x86 COM from x64 .NET 的重复问题。 - StayOnTarget
3个回答

41
你需要将32位dll加载到一个单独的32位进程中,并通过进程间通信使64位进程与其通信。否则,我认为没有任何方法可以将32位dll加载到64位进程中。
这里有一篇相当不错的文章: 从64位代码访问32位DLL

那是我所描述的64位 -> COM -> 32位事情。在阅读了那篇文章并尝试让示例运行之后,我决定一定有更好的方法。至少我希望如此。 - David J. Sokol
3
John的回答是正确的。在一个进程中无法混合使用32位和64位模块。您需要启动第二个进程。另请参见我在这里的答案:https://dev59.com/eWw15IYBdhLWcg3wkcuq#6533556 - Helge Klein
2
你不一定需要使用COM+包装器,但你需要使用32位进程。 - Rob Hunter
这是正确的。请参阅微软的页面:https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa384231(v=vs.85).aspx - John B. Lambe
Windows代理进程似乎是一个很好的潜在方法:https://dev59.com/fnRC5IYBdhLWcg3wROpQ#359389 - StayOnTarget
阅读这篇文章,它只是描述了要做什么,而不是如何做。 - Jacob Waters

1
您需要将可执行进程写成 32 位进程(而非任何 CPU 或 x64),这样它们将会被 WoW32 装载到 Vista 中。这将以 32 位仿真模式加载它们,您就不会遇到入口点问题了。您可以将库保留在 AnyCPU 模式下,但必须将可执行文件编译成 x86。

1
听起来他们已经考虑过这个问题,但需要64位提供的更大内存上限。 - John Sibly
一半是正确的:如果你将32位进程编译为x86,它们可以在x64机器上运行。但是,如果你的可执行文件是x86,而你的库是AnyCPU - 即时编译器会将它们转换为x64代码,这使它们与(32位)可执行文件不兼容。因此,包括程序集在内的所有内容都必须是x86或AnyCPU。 - Matt

0

如果你不想重新编译现有的 dll 文件,John 的答案是正确的;然而这也可能是一个选项。

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


3
只要您没有需要作为引用添加的32位第三方程序集(没有源代码),这个方法就能正常工作。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接