cta*_*cke 7 c# interop 32bit-64bit
我遇到了一个问题,我很确定我知道答案,但我想我至少会问,看看是否有一些"神奇的子弹"可能会让我头疼不已.
这是高级视图.
我有一个托管应用程序.此应用程序通过来自不同供应商的第三方库与硬件连接.我可以完全控制使用托管应用程序并对硬件API库进行零控制.
供应商A仅提供32位本机SDK.为了允许我们在64位系统上使用它,我们将应用程序标记为以32位模式运行.一切都好.
我们现在与Vendor B集成,后者在64位计算机上提供64位特定的本机API库.来自供应商B的32位本机DLL将无法在64位系统上运行(尝试过).如果我构建一个运行为64位或AnyCPU的测试工具,它可以正常工作.如果我将其标记为32位,则在P/Invoke调用上失败.
似乎供应商A和供应商B硬件将在64位PC上互斥,但我想知道是否有人有关于如何解决这个问题的建议.
问题不是.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进行通信.这具有将核心应用程序与可能不稳定的第三方组件分离的额外好处.如果第三方组件崩溃或行为不当,则只需重新启动包含该组件的进程即可.