2009-02-05 23 views
404

我對Visual Studio 2008中的.NET平臺構建選項有一些疑惑。Visual Studio「任何CPU」目標是什麼意思?

什麼是「任何CPU」編譯目標,以及它生成什麼類型​​的文件?我檢查了這個「任何CPU」構建的輸出可執行文件,並發現它們是x86可執行文件(誰不會看到它!)。那麼,將可執行文件定位到x86與「任何CPU」之間有什麼區別?

我注意到的另一件事是託管的C++項目沒有這個平臺作爲選項。這是爲什麼?這是否意味着我懷疑「任何CPU」可執行文件是純32位的可執行文件是正確的?

+4

一兩件事決定使用哪個平臺的目標時要考慮:如果*啓動項目的目標是*`任何CPU`和你捉迷藏在64位的操作系統,你失去的能力, *在調試時編輯並繼續*。 (你正在有效地調試一個64位進程)。你可以讓* Startup項目*目標`x86`在調試時繞過這個。 (從啓動項目引用的程序集可能會繼續定位「Any CPU」。 – 2013-03-06 11:27:50

+8

@CristiDiaconescu使用VS2013編輯並繼續現在可以使用 – ms007 2013-11-14 12:50:53

回答

317

An AnyCPU程序集將在裝載到64位進程時將JIT轉換爲64位代碼,並且在裝入32位進程時將裝入32位。

通過限制CPU你會說:大會正在使用的東西(可能是非託管的東西),需要32位或64位。

+2

那麼,如何生成程序集,它將在C++中將JIT轉換爲x64? – galets 2009-02-05 16:48:15

+40

C++項目編譯爲本機代碼,所以JIT編譯器不參與...因此,你不能做你正在問的問題 – cplotts 2010-05-25 14:53:11

+7

@cplotts:因爲@galets在3個月前提出這個問題,他不太可能會看到你的答案,使用@galets前綴在你的評論中類似於我在這裏的方式,以便他得到關於你的答案的警報 – AnthonyWJones 2010-05-25 15:02:57

50

這是一個quick overview,它解釋了不同的構建目標。根據我自己的經驗,如果您希望構建可在x86和x64應用程序上運行的項目,並且您沒有任何特定的x64優化,我會更改構建以專門說「x86 「。

這樣做的原因有時你可能會碰到一些碰撞的DLL或一些在x64環境中崩潰WOW的代碼。通過專門指定x86,x64操作系統將把應用視爲純粹的x86應用,並確保一切順利運行。

39

「任何CPU」意味着程序啓動時,.NET Framework將根據OS位數計算出是否以32位或64位運行程序。

有和任何CPU之間的區別:一個x64系統上,你的可執行文件編譯爲X86將運行32位可執行文件。

就你的懷疑而言,只需進入視覺  Studio   2008命令行並運行以下命令。

dumpbin YourProgram.exe /headers 

它會告訴你你的程序的位數,加上更多。

43

查看該文章Visual Studio .NET Platform Target Explained

默認設置「任何CPU」意味着程序集將在其當前運行的CPU上原生運行 。意思是,它將在64位機器上以64位運行 ,在32位機器上運行32位。如果 程序集是從64位應用程序調用的,則它將作爲一個 64位程序集執行,等等。

上面的鏈接已被報道被打破,所以這裏是另一篇文章中有類似的解釋:What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11

31

任何CPU意味着它將在任何平臺上運行。這是因爲託管代碼與Java相似。可以將其視爲編譯爲由.NET Framework在運行時解釋的字節代碼。

C++沒有這個選項,因爲它被編譯爲特定於平臺的機器代碼。

250

我認爲最重要的東西已經說了,但我想我要補充一點
如果編譯爲任何CPU和x64平臺上運行,那麼你將無法加載32位DLL,因爲你的應用程序沒有在WOW64中啓動,但這些DLL需要在那裏運行。
如果您編譯爲x86,那麼x64系統將在WOW64中運行您的應用程序,並且您將能夠加載32位dll。
所以我認爲你應該選擇「任何CPU」,如果你的依賴可以在任一環境中運行,但是如果你有32位依賴,選擇x86。這從微軟條本解釋了一下:

/CLRIMAGETYPE (Specify Type of CLR Image)

1

我建議你閱讀這post.

使用AnyCPU時,語義如下:

  • 如果過程中32位Windows系統上運行,它會作爲一個32位進程。 IL被編譯爲x86機器代碼。
  • 如果進程在64位Windows系統上運行,它將作爲32位進程運行。 IL被編譯爲x86機器代碼。
  • 如果進程在ARM Windows系統上運行,它將作爲32位進程運行。 IL被編譯爲ARM機器碼。
相關問題