PROCESSOR_ARCHITECTURE在某些32位进程中返回AMD64

时间:2010-11-11 07:45:58

标签: c# visual-studio-2010 environment-variables x86-64

我遇到了一个奇怪的情况,32位进程声称其PROCESSOR_ARCHITECTURE是AMD64,导致基于该标志做出决策的组件出现故障。

我将它分离到以下步骤:

  • 在VS2010中,创建一个库项目
  • 在Project properties / Debug选项卡中,将Start External Program设置为VS exe(例如C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ devenv.exe)
  • 执行Ctrl-F5运行,启动另一个VS实例
  • 在第二个实例中,创建一个控制台应用并粘贴以下代码

在Main:

Console.WriteLine(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"));
Console.ReadLine();
  • 现在运行控制台应用

它显示AMD64,即使它是32位进程(Console应用程序的默认设置,每个Build设置)。

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

注意:如果你很好奇,我以这种方式运行VS的原因是我正在为第二个实例使用实验配置单元

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

3 个答案:

答案 0 :(得分:2)

这不会直接回答您的问题,但为什么您不只是测试IntPtr.Size的值?如果它是4那么你是32位,如果它是8那么你是64位。

.NET framework 4还具有Is64BitProcessIs64BitOperatingSystem属性,这肯定是前进的方式......

答案 1 :(得分:1)

根据我的调查结果,我认为我可以为此提出合理的解释。

通过将项目设置为“任何CPU”(类库的默认值),PROCESSOR_ARCHITECTURE环境变量将设置为运行外部进程时最有能力的,“AMD64”为64-位OS。但是,由于Visual Studio IDE实际上是一个使用WOW运行的32位进程,因此从第二个实例中启动的进程可能会造成混淆。

强制库明确定位32位平台将正确设置我找到的东西。也许你应该这样做。

答案 2 :(得分:0)

据我所知,PROCESSOR_ARHITECTURE不是硬件处理器,而是指操作系统软件的处理器。

由于AMD是第一个创建64位架构(x86-64)的公司,微软为此提供了对操作系统的支持,并留下了AMD最初给予它的头衔。 AMD64和Intel64实际上指的是相同的x86-64架构,因此它们是兼容的。

您可以尝试例如获取PROCESSOR_IDENTIFIER,并根据其中的信息确定处理器的类型。

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