【问题标题】:PROCESSOR_ARCHITECTURE returns AMD64 in some 32-bit processesPROCESSOR_ARCHITECTURE 在某些 32 位进程中返回 AMD64
【发布时间】:2010-11-11 07:45:58
【问题描述】:

我遇到了一个奇怪的场景,一个 32 位进程声称其 PROCESSOR_ARCHITECTURE 是 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) 来查找它并依赖它是正确的。

【问题讨论】:

  • PROCESSOR_ARCHITECTURE 实际上是每个进程。例如如果您直接从第一个 VS 运行控制台应用程序,则会显示 x86。请注意,我自己并没有查找 env 变量。我正在使用一个组件(SQLCE 4.0),它本身正在查找它(选择正确的本机二进制文件集),所以它不在我的控制之下。
  • 我自己试过了,结果发现按照你的步骤我不能执行。 Error Image。显然项目的构建设置针对 64 位?我注意到默认情况下,活动平台设置为“X64”而不是“任何 CPU”。
  • @Jeff:实际上对我来说默认目标是 32 位。您遇到的奇怪错误,无法解释!如果将目标设置为 32 位呢?
  • 啊,你知道吗,我在调试模式下运行它...哎呀。

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


【解决方案1】:

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

.NET framework 4 还具有 Is64BitProcessIs64BitOperatingSystem 属性,这绝对是前进的方向......

【讨论】:

  • 查看问题中的更新:这不是我自己测试的东西。
【解决方案2】:

根据我的发现,我想我可以对此提出一个合理的解释。

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

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

【讨论】:

  • p.s.,您不必将 Visual Studio 作为外部进程运行。命令提示符会很好。然后你可以在那里检查环境变量。
  • 啊,是的,你是对的!虽然感觉某处有错误。您会认为 PROCESSOR_ARCHITECTURE 将由操作系统根据进程的真实位数设置,但我猜不是...
【解决方案3】:

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

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

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

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

【讨论】:

  • 我相信应该为每个进程设置 PROCESSOR_ARCHITECTURE。另外,请注意,直接启动上面的控制台应用程序会使其显示“x86”,因此在 VS 启动 VS 时会发生一些奇怪的事情。
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 2014-01-29
  • 2013-01-12
  • 2019-12-27
  • 2014-05-10
相关资源
最近更新 更多