gpt4 book ai didi

c# - 混合 32 位和 64 位 P/Invoke

转载 作者:太空狗 更新时间:2023-10-29 20:18:29 24 4
gpt4 key购买 nike

我遇到了一个我很确定我知道答案的问题,但我想我至少会问一下,看看是否有一些“ Elixir ”可以让我免于头痛。

这是高级 View 。

我有一个托管应用程序。该应用程序通过来自不同供应商的第三方库与硬件接口(interface)。我可以完全控制使用中的托管应用程序,并且可以零控制硬件 API 库。

供应商 A 仅提供 32 位原生 SDK。为了允许我们在 64 位系统上使用它,我们将应用程序标记为在 32 位模式下运行。一切顺利。

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

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

最佳答案

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

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

关于c# - 混合 32 位和 64 位 P/Invoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4393012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com