【问题标题】:library compiled with C# for anyCPU does not work in 64 bit version of windows用 C# 为 anyCPU 编译的库在 64 位版本的 windows 中不起作用
【发布时间】:2014-09-05 10:56:16
【问题描述】:

一年多前,我在 Windows 7 32 位下使用 C# 创建了一个库,它工作正常,这个库使用“User32.dll”和“Gdi32.dll”库。

起初我为 AnyCPU 编译了这个库,它在 32 位上工作,但在 win 64 位上不工作,我也为 64 位 CPU 编译过,但同样的情况又发生了。

我的库使用“User32.dll”中的“RawInput devices”和“gdi32.dll”中的“GetDeviceCaps”。

【问题讨论】:

  • 库项目的平台目标设置非常不相关。决定进程位数的是EXE项目。没有使用正确的错误检查和使用需要 IntPtr 的 int 摸索 pinvoke 声明是标准错误。在 32 位进程中工作,在 64 位中失败。没有人可以看到您的,也无法猜测“不起作用”的含义。
  • 解决你问题的方法在于只有你能看到的代码。

标签: c# windows winapi dll 32bit-64bit


【解决方案1】:

This article 在 channel9 说:

本质上是 32 位的第三方 DLL,不能从 64 位客户端访问。我还没有看到任何实际可行的解决方法。显然,如果使用“任何 CPU”编译并从 32 位或 64 位主机客户端调用,.NET DLL 将自动调整。

还有在 MSDN 中的this question

64 位可执行文件无法调用 32 位 dll,反之亦然。除非您确实需要您的应用程序为 64 位,否则最简单的选择是将其设置为目标 x86。这仍然允许它在 32 位和 64 位版本的 Windows 上运行。

如果由于某种原因这不适用,一个可能的解决方案是创建一个单独的 32 位进程来加载 32 位 dll,并让您的 64 位应用程序与其他进程通信,可能使用 IPC(在某些微不足道的情况下,重定向标准输入和输出也可以工作,甚至只是检查进程的返回值)。无论如何,这会导致一些额外的工作;我建议您首先准确地查看您的要求。

【讨论】:

  • 感谢 Krumia 的有用回复。我会尝试一下,很快就会回来。
  • 这是真的,但可能无关紧要。问题中讨论的 DLL 在 32 位和 64 位版本中都存在。
  • 感谢 David Heffernan 的回复,您对我有什么建议吗?正如我之前所说,我使用原始输入设备,应用程序在 64 位模式下运行,没有任何错误,但它不起作用。我的程序使用原始输入来捕获鼠标,但它返回的事件不是正确的事件,我的意思是当鼠标移动时我得到鼠​​标移动事件但鼠标位置每次都是常数,除非任何鼠标按钮单击然后鼠标指向将向右移动。
猜你喜欢
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多