C# 处理器体系结构在某些32位进程中返回AMD64

C# 处理器体系结构在某些32位进程中返回AMD64,c#,visual-studio-2010,environment-variables,x86-64,C#,Visual Studio 2010,Environment Variables,X86 64,我遇到了一个奇怪的场景,一个32位进程声称其处理器_架构是AMD64,导致基于该标志做出决策的组件出现故障 我将其隔离到以下步骤: 在VS2010中,创建一个库项目 在“项目属性/调试”选项卡中,将“启动外部程序”设置为VS exe(例如C:\Program Files(x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe) 执行Ctrl-F5以运行,这将启动另一个VS实例 在第二个实例中,创建一个控制台应用程序并粘贴以下代码 大体

我遇到了一个奇怪的场景,一个32位进程声称其处理器_架构是AMD64,导致基于该标志做出决策的组件出现故障

我将其隔离到以下步骤:

  • 在VS2010中,创建一个库项目
  • 在“项目属性/调试”选项卡中,将“启动外部程序”设置为VS exe(例如C:\Program Files(x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe)
  • 执行Ctrl-F5以运行,这将启动另一个VS实例
  • 在第二个实例中,创建一个控制台应用程序并粘贴以下代码
大体上:

Console.WriteLine(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"));
Console.ReadLine();
  • 现在运行控制台应用程序
它显示AMD64,即使它是一个32位进程(控制台应用程序的默认设置,每个构建设置)

问题:其他人是否也可以重复这一点,如果可以,你能解释一下吗

注意:如果你好奇的话,我以这种方式运行VS的原因是我在第二个实例中使用了一个实验蜂箱


更新:注意,在我的真实场景中,我自己并没有查找这个环境变量。相反,我使用一个组件(SQLCE)来查找它并依赖它是否正确。

这并不能直接回答您的问题,但为什么不简单地测试
IntPtr.Size的值呢?如果是4,则为32位,如果是8,则为64位


.NET framework 4还具有和属性,这肯定是向前发展的方向…

据我所知,处理器体系结构它不是硬件处理器,它指的是操作系统软件的处理器

由于AMD是第一个创建64位ArhitArchitecture(x86-64)的公司,微软在操作系统中为此提供了支持,并保留了AMD最初给它的名称。AMD64和Intel64实际上是指相同的x86-64体系结构,因此它们是兼容的

例如,您可以尝试获取PROCESSOR_标识符,并从其中的信息中找出处理器的类型


如果我错了,有人可以纠正我。

根据我的发现,我认为我可以对此做出合理的解释

通过将项目设置为目标“任意CPU”(类库的默认值),环境变量
PROCESSOR\u ARCHITECTURE
将被设置为在64位操作系统上运行外部进程时最有能力的变量“AMD64”。然而,由于visualstudioide实际上是一个32位进程,使用WOW运行,这可能会让从第二个实例中启动的进程感到困惑


强制库显式地以32位平台为目标将正确设置我发现的内容。也许你应该这样做。

处理器体系结构实际上是每个进程。e、 g.如果您直接从第一个VS运行console应用程序,它将显示x86。请注意,我自己并没有查找env变量。我正在使用一个组件(SQLCE 4.0),该组件本身正在查找它(以选择正确的本机二进制文件集),因此它不在我的控制之下。我自己也尝试过,但发现按照您的步骤执行是不允许的。显然,该项目的构建设置以64位为目标?我注意到,默认情况下,活动平台设置为“X64”,而不是“任何CPU”。@Jeff:实际上,对我来说,默认目标是32位。你犯了一个奇怪的错误,无法解释!如果将目标设置为32位呢?啊,你知道吗,我在调试模式下运行它。。。哎哟。看看问题中的更新:这不是我自己测试的东西。我相信应该为每个进程设置处理器体系结构。另外,请注意,直接启动上面的控制台应用程序会使其显示“x86”,因此VS由VS.p.s启动时会出现一些奇怪的情况,您不必将Visual Studio作为外部进程运行。一个命令提示符就可以了。然后你可以检查那里的环境变量。啊,是的,你说得对!虽然感觉好像有个虫子在某处。你可能会认为,处理器体系结构将由操作系统根据进程的真实比特数来设置,但我猜不是。。。