2010-11-11 14 views
4

我遇到了一個奇怪的場景,其中32位進程聲稱其PROCESSOR_ARCHITECTURE是AMD64,導致基於該標誌做出決定的組件出現故障。PROCESSOR_ARCHITECTURE在某些32位進程中返回AMD64

我孤立它下列步驟操作:

  • 在VS2010,創建庫項目
  • 在項目屬性/調試選項卡,設置啓動外部程序的VS exe文件(例如C:\ Program Files文件(x86)的\微軟的Visual Studio 10.0 \ Common7 \ IDE \ devenv.exe的)
  • 請按Ctrl-F5運行,其推出的又一實例VS
  • 在這第二種情況下,創建一個控制檯應用程序,並粘貼以下代碼

在主營:

Console.WriteLine(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")); 
Console.ReadLine(); 
  • 現在運行控制檯應用程序

並顯示AMD64,即使它是一個32位進程(默認爲控制檯應用程序,每生成設置) 。

問題:其他人也可以重複這個,如果可以,你能解釋一下嗎?

注意:如果你好奇,我跑VS這種方式的原因是,我使用的是實驗蜂巢二審

更新:請注意,在我的實際情況,我不看自己修改這個環境變量。相反,我使用一個組件(SQLCE)來查找它並依賴它是正確的。

+0

PROCESSOR_ARCHITECTURE實際上是每個進程。例如如果你直接從第一個VS運行控制檯應用程序,它會說x86。請注意,我沒有自己查找env變量。我正在使用一個組件(SQLCE 4.0),它本身正在查找它(選擇正確的本機二進制文件),所以它不在我的控制之下。 – 2010-11-11 07:55:38

+0

我已經嘗試過自己,只發現以下步驟不允許我執行。 [錯誤圖片](http://imgur.com/FOoR8.png)。顯然,該項目的構建設置目標是64位?我注意到,默認情況下,活動平臺設置爲「X64」而不是「任何CPU」。 – 2010-11-11 08:03:09

+0

@Jeff:實際上我的默認目標是32位。奇怪的錯誤,你得到,無法解釋它!如果你將目標設置爲32位呢? – 2010-11-11 08:09:24

回答

1

根據我的發現,我想我可以想出一個合理的解釋。

通過將項目設置爲「任何CPU」(類庫的默認值),PROCESSOR_ARCHITECTURE環境變量將設置爲運行外部進程時最有效的功能,即64位操作系統的「AMD64」。但是,由於Visual Studio IDE實際上是一個使用WOW運行的32位進程,因此可能會對從第二個實例中啓動的進程感到困惑。

強制庫明確定位到32位平臺將會正確設置我找到的東西。也許你應該這樣做。

+1

p.s.,您不必將Visual Studio作爲外部進程運行。命令提示符將很好地執行。然後你可以檢查那裏的環境變量。 – 2010-11-11 08:32:05

+0

啊,是的,你是對的!雖然感覺就像某處有bug。你會認爲PROCESSOR_ARCHITECTURE將由操作系統根據進程的真實位數設置,但我猜不是... – 2010-11-11 08:41:34

2

這並不直接回答你的問題,但你爲什麼不簡單地測試IntPtr.Size的價值?如果它是4,那麼你是32位,如果它是8,那麼你是64位。

.NET框架4還具有Is64BitProcessIs64BitOperatingSystem性能,這肯定會去前進的方式......

+0

查看問題中的更新:這不是我正在測試自己。 – 2010-11-11 07:59:01

0

據我所知,在PROCESSOR_ARHITECTURE它不是硬件處理器,它指的是處理器的OS軟件是爲了。由於AMD是第一個創建64位架構(x86-64)的公司,因此微軟在操作系統中加入了對此的支持,並留下了AMD最初給出的標題。 AMD64和Intel64實際上指的是相同的x86-64架構,因此它們是兼容的。

你可以嘗試例如獲取PROCESSOR_IDENTIFIER,並從裏面的信息中找出處理器的類型。

有人可以糾正我,如果我在這裏錯了。

+0

我相信PROCESSOR_ARCHITECTURE應該爲每個進程設置。此外,請注意,啓動上面的控制檯應用程序直接使其顯示「x86」,所以VS由VS啓動時會發生一些奇怪的事情。 – 2010-11-11 08:03:55