關於.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
版權宣告:本文為博主原創文章,轉載請附上博文連結!