混合32位和64位P / Invokes

时间:2010-12-08 22:27:51

标签: c# interop 32bit-64bit

我遇到了一个问题,我很确定我知道答案,但我想我至少会问,看看是否有一些“神奇的子弹”可能会让我头疼不已。 / p>

这是高级视图。

我有一个托管应用程序。此应用程序通过来自不同供应商的第三方库与硬件连接。我可以完全控制使用托管应用程序并对硬件API库进行零控制。

供应商A仅提供32位本机SDK。为了允许我们在64位系统上使用它,我们将应用程序标记为以32位模式运行。一切都很好。

我们现在与Vendor B集成,后者在64位计算机上提供64位特定的本机API库。来自供应商B的32位本机DLL将无法在64位系统上运行(尝试过)。如果我构建一个运行为64位或AnyCPU的测试工具,它可以正常工作。如果我将其标记为32位,则在P / Invoke调用中失败。

似乎供应商A和供应商B硬件将在64位PC上互斥,但我想知道是否有人就如何解决这个问题提出了建议。

4 个答案:

答案 0 :(得分:6)

问题不是.NET或P / Invoke。这是一个操作系统问题。 64位进程只能加载64位DLL。 32位进程只能加载32位DLL。在用户模式进程(EXE和DLL)与内核之间存在神奇的Windows-on-Windows(或WoW)层,它允许在64位Windows上运行32位应用程序。无法在64位进程内运行32位DLL。 WoW层存在于其下方。 (基本上,WoW是一个围绕64位Win32 API的32位包装器,它在进程的32位世界和操作系统的64位世界之间整理数据和函数调用。)

您最好/唯一的选择是在单独的进程中运行32位和64位组件,并使用某种形式的IPC进行通信。这具有将核心应用程序与可能不稳定的第三方组件分离的额外好处。如果第三方组件崩溃或行为不当,则只需重新启动包含该组件的进程即可。

答案 1 :(得分:1)

您可以创建一个单独的32位进程与供应商A进行交互,然后使用WCF与其进行通信。

答案 2 :(得分:1)

由于无法将32位和64位图像加载到同一进程中,因此必须使用多进程解决方案。

答案 3 :(得分:0)

希望有人可以建议更好的替代方案,但也许你可以在一个单独的进程中包装其中一个库(与你的应用程序具有最低带宽连接),然后与它通信(例如通过套接字)。