1. 程式人生 > >關於.NET編譯的目標平臺(AnyCPU,x86,x64)

關於.NET編譯的目標平臺(AnyCPU,x86,x64)

在VisualStudio中專案平臺屬性包含x86/x64/AnyCPU三個選項,之前的專案中並沒有特別去關注這一點,最近的專案中涉及到了在不同平臺執行的問題,所以專門瞭解並整理了這方面的知識。

x86/x64/AnyCPU的含義
在vs中這一選項被稱為“目標平臺”,也就是編譯成功的專案最終是要在什麼平臺上執行。 


編譯(目標)平臺    含義
x86    將程式集編譯為由相容 x86 的 32 位公共語言執行庫執行;
x64    將程式集編譯為由支援 AMD64 或 EM64T 指令集的計算機上的 64 位公共語言執行庫執行;
AnyCPU    (預設值)將程式集編譯為在任意平臺上執行。
x86/x64/AnyCPU的區別
我們使用.NET平臺開發程式所構造的專案被稱為“程式集”,程式集的輸出型別有Windows應用程式、控制檯應用程式、類庫。使用頻率較高的是Windows應用程式和類庫。Windows應用程式一般包括我們常見的WinForm、WPF程式,檔案格式通常為可執行檔案(.exe);類庫一般是WEB程式或動態連結庫,檔案格式通常為.dll。 
關於x86/x64/AnyCPU之間的區別,我們就看一看exe和dll兩類檔案在不同平臺的作業系統上執行的結果。

x86作業系統
目標平臺    程式型別    執行結果
x86    應用程式exe    在32位CLR上執行
x86    類庫dll    在32位CLR上執行
x64    應用程式exe    無法執行
x64    類庫dll    無法執行
AnyCPU    應用程式exe    在32位CLR上執行
AnyCPU    類庫dll    在32位CLR上執行
x64作業系統
目標平臺    程式型別    執行結果
x86    應用程式exe    在WOW下的32位CLR上執行
x86    類庫dll    在WOW下的32位CLR上執行
x64    應用程式exe    在64位CLR上執行
x64    類庫dll    在64位CLR上執行
AnyCPU    應用程式exe    在64為CLR上執行
AnyCPU    類庫dll    在與載入它的程序相同的CLR上執行
從上面的執行結果來看我們可以基本確定一個結論:

主程式和其引用的類庫在執行時的平臺應該保持一致。

不過這樣理解起來還是有些問題,我們舉幾個例子: 
1. AnyCPU的應用程式+AnyCPU的類庫 
在x86的作業系統上,應用程式會在32位CLR上執行,所以它引用的類庫也會在32位CLR上執行; 
在x64作業系統上,應用程式許會在64位CLR上執行,所以它引用的類庫也會在64為CLR上執行。 
2. x86的應用程式+AnyCPU的類庫 
在x86的作業系統上,應用程式會在32位CLR上執行,它引用的類庫也會在32位CLR上執行; 
在x64的作業系統上,應用程式會在WOW下的32位CLR上執行,它引用的類庫也會在WOW下的332位CLR上執行。 
3. x64的應用程式+AnyCPU的類庫 
在x86的作業系統上,應用程式無法執行,更不要說引用類庫了; 
在x64的作業系統上,應用程式會在64位CLR上執行,引用的類庫也會在64位CLR上執行。 
4. AnyCPU的應用程式+x64的類庫 
在x86的作業系統上,應用程式會在32位CLR上執行,但引用的類庫無法在32為CLR上執行,程式報錯; 
在x64的作業系統上,應用程式會在64位CLR上執行,引用的類庫也會在64位CLR上執行。 
5. AnyCPU的應用程式+x86的類庫 
在x86的作業系統上,應用程式會在32位CLR上執行,引用的類庫也會在32位CLR上執行; 
在x64的作業系統上,應用程式會在64位CLR上執行,但引用的類庫無法在64位CLR上執行。

有了以上的例子,是不是有點明白了?當然我們的主程式並不限於應用程式exe,不要忘了常見的Web應用的主程式就是類庫,不過原理還是一樣的:主程式和引用類庫在執行時的平臺要保持一致。

一般來講,我們可以把主程式的目標平臺根據實際需求設定為跟部署的作業系統一致,類庫最好是AnyCPU。當然特殊的部署環境還要特殊考慮。
--------------------- 
作者:ludewig 
來源:CSDN 
原文:https://blog.csdn.net/lordwish/article/details/52312015 
版權宣告:本文為博主原創文章,轉載請附上博文連結!