为什么我用Any CPU编译的应用在64位机器上运行时变成了32位进程?

11
为什么我使用 AnyCPU 编译的应用程序在我的64位机器上作为32位进程运行,因此无法与作为64位进程运行的记事本进行交互? 以下是我的代码,它无法在x64操作系统上运行,因为 notepad.exe 是x64应用程序,而 x86应用程序无法获取x64进程的模块信息:
prc.Modules[0].FileName

我的.Net代码出现了异常:

System.ComponentModel.Win32Exception (0x80004005):32位进程无法访问64位进程的模块。

根据这个论坛和MSDN等许多答案和文章的解释,我知道需要使用AnyCPU配置,因为对我来说使用x64没有具体好处。即使在编译时使用了AnyCPU配置,我的错误仍然存在,此外,在任务管理器中,我看到我的进程名后面有一个(32-bit)

(实际上,我测试了性能并且x64代码运行速度比较快,大约快40毫秒。不管怎样,我不想让代码运行得更快 :D )

我不知道出了什么问题。

VS 2011 Beta (x64)

Windows 8 Consumer Preview (x64)

祝好,Peyman Mortazavi


1
你确定在出现异常时使用了 Any CPU 进行编译吗? - Eric J.
配置名称与平台目标设置无关。这是在早期版本的VS上启动的项目中出现的尴尬问题。 - Hans Passant
亲爱的汉斯,我在Visual Studio 2011上创建了这个项目。 - Peyman
2个回答

15
尽管提问者已经接受了答案,但我觉得这个答案不完整,因为提问者提到他正在使用Visual Studio 2011,并假设目标.Net Framework将是4.5,因此关于" AnyCPU "的含义有一些注意事项。
请参考以下链接,以更好地了解随着时间推移," AnyCPU "的含义如何发生变化。
  1. http://blogs.microsoft.co.il/sasha/2012/04/04/what-anycpu-really-means-as-of-net-45-and-visual-studio-11/
  2. https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/platform-compiler-option

通过这些链接,您可以得出为什么您的应用程序作为32位进程运行的答案。

在64位Windows操作系统上:

使用/ platform:anycpu32bitpreferred编译的可执行文件在32位CLR上执行。

这就是罪魁祸首。

enter image description here


2
这是正确的答案。 任何 CPU 是必需的,但不足够。必须取消选择“首选 32 位”! - Ayub
我还想补充一点,在.NET SDK风格项目中,你应该检查<RuntimeIdentifier>属性。例如,如果上述所有属性都经过了检查,但您有一个win7-x86运行时标识符,它仍将作为32位进程运行。 - Robert

2

进入项目属性。在左侧选择“生成”。

查看当前活动平台的“平台目标:”设置。将其更改为x64。

(我怀疑您的“平台目标:”将明确为“任何CPU”的x86)

enter image description here


还要检查项目配置管理器。有时它会显示哪个项目设置不正确。 - CodingBarfield
我已经检查过了,它们都是正确的。我认为问题出在Visual Studio 2011上,因为我记得以前用这段代码时没有问题。 - Peyman
为什么要改成x64?是为了确保问题的原因是编译配置吗?我已经将其改为x64,并且它可以正常工作,没有抛出异常。所以问题确实是编译器配置。 - Peyman
是的,为了确保或在vs2011出现问题时作为解决方法。 - jglouie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接