2012-02-07 172 views
23

我的理解是.NET應用程序是獨立於平臺的,所以純.NET代碼應該運行在x86或64位機器上。除非你的.NET代碼調用一些本地代碼,否則它是依賴於平臺的。真的嗎?32位.NET應用程序和64位.NET應用程序有區別嗎?

+0

不是每個.NET應用程序都運行大量本機代碼。還有很多本地代碼可用於這兩種風格。操作系統就是最好的例子。隨後是CLR和抖動。 – 2012-02-07 14:06:59

回答

17

.NET應用程序可以編譯爲定位x86,x64或「Both」。通常情況下,如果您依賴於其他平臺不可用的COM控件,則只需定位一個平臺。

3

是的,您說的是真實的。純粹的.NET代碼是獨立於平臺的(Visual Studio中的「任何CPU」),除非使用外部庫(據我所知,COM和P/Invokes)。然後,您的平臺必須與用於構建外部庫的平臺匹配。

9

您的代碼可以編譯爲完全獨立於平臺,也可以針對特定平臺。標準建議是將庫結構保持中立(即「任何CPU」),併爲可執行文件指定x86。 AnyCPU executables are usually more trouble than they're worth:爲什麼Visual Studio 2010中默認使用這種方法的原因說明如下

  1. 在兩個非常不同的模式(x64和x86)運行增加了產品的複雜性和測試成本。
  2. 無論如何,32位往往會(稍快)一些。
  3. 某些功能在x64中不可用。
  4. 如果超過4個  GB地址空間將會很有用,那麼正確的做法是將僅作爲 x64,並避免支持兩個平臺的成本。

當然,如果你只是針對86那麼你的代碼將在x64通過WoW64仍然可以運行。

+0

我對可執行文件的默認行爲非常困惑。目標到x86? – 2012-02-07 14:06:11

+0

是的,可執行文件以x86爲目標。在VS2010中創建一個新的解決方案,然後添加一個控制檯應用程序,一個Windows窗體應用程序,一個WPF應用程序和一個類庫。如果您隨後查看配置管理器(右鍵單擊該解決方案,它位於上下文菜單中),您將看到應用程序全部配置爲x86,而類庫則設置爲AnyCPU。如果你意外地創建了一個AnyCPU版本(就像我幾個月前做的那樣),這可能會特別惱人 - 你的可執行文件將不會被構建,因爲它們默認沒有任何有效的AnyCPU配置。 – 2012-02-07 14:11:32

+0

x86意味着它嚴格編譯32位,x64意味着它嚴格編譯64位,而AnyCPU意味着它編譯32位操作系統上的32位和64位操作系統上的64位。如果您對COM/PInvoke進行任何調用,則需要針對正確的拱形,因爲COM/PInvoke使用指針而不是引用。我可能會稍微偏離,但這是總體思路。附: 64位可以訪問額外的CPU寄存器,因此代碼可能更快,並且所有64位整數可以在1個週期內計算。因此,任何Int64變量將運行得更快。 – Bengie 2012-02-07 14:13:02

相關問題