使用C#for anyCPU编译的库在64位版本的windows中不工作

使用C#for anyCPU编译的库在64位版本的windows中不工作,c#,windows,winapi,dll,32bit-64bit,C#,Windows,Winapi,Dll,32bit 64bit,一年多前,我在Windows7 32位下用C#创建了一个库,它工作正常,这个库使用“User32.dll”和“Gdi32.dll”库 起初,我为任何CPU编译了这个库,它在32位上工作,但在64位上不工作,我也为64位CPU编译了它,但同样的情况再次发生 我的库使用“User32.dll”中的“RawInput设备”和“gdi32.dll”中的“GetDeviceCaps”。在channel9中说: 第三方DLL本质上是32位的,不能从64位客户端访问。我还没有看到任何可行的解决办法。显然,如果

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

起初,我为任何CPU编译了这个库,它在32位上工作,但在64位上不工作,我也为64位CPU编译了它,但同样的情况再次发生

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

在channel9中说:

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

以及在MSDN中:

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

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


库项目上的平台目标设置是非常不相关的。决定进程位的是EXE项目。不使用正确的错误检查和在需要IntPtr的地方使用int摸索pinvoke声明是标准错误。在32位进程中工作,在64位中失败。没有人能看到你的,也猜不到是什么“不行"可能是指。您的问题的解决方案在于只有您才能看到的代码。谢谢Krumia的有用回复。我会尝试一下,并很快返回结果。这是事实,但可能不相关。问题中讨论的DLL有32位和64位版本。谢谢David Heffernan的回复,您对或者我?正如我之前所说,我使用原始输入设备,应用程序在64位模式下运行,没有任何错误,但它不工作。我的程序使用原始输入捕获鼠标,但它返回的事件不是正确的事件,我的意思是,当鼠标移动时,我会得到鼠标移动事件,但鼠标位置每次都是常量,除非有任何鼠标移动e按钮单击,然后鼠标点将向右移动。