一、x86、x64、Any CPU的區別
1、在VisualStudio中,在編譯設置中有如下選項:
編譯(目標)平臺 | 含義 |
x86 | 將程序集編譯爲由兼容 x86 的 32 位公共語言運行庫運行; |
x64 | 將程序集編譯爲由支持 AMD64 或 EM64T 指令集的計算機上的 64 位公共語言運行庫運行; |
AnyCPU | (默認值)將程序集編譯爲在任意平臺上運行。 |
2、具體行爲如下:
目標平臺 | 程序類型 | 運行結果 |
x86 | 應用程序exe | 在32位CLR上運行 |
x86 | 類庫dll | 在32位CLR上運行 |
x64 | 應用程序exe | 無法運行 |
x64 | 類庫dll | 無法運行 |
AnyCPU | 應用程序exe | 在32位CLR上運行 |
AnyCPU | 類庫dll | 在32位CLR上運行 |
目標平臺 | 程序類型 | 運行結果 |
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上運行 |
說明:
① 簡單的說,它們之間最直接的區別就是:x86平臺編譯出來的exe(可執行文件)或dll(動態鏈接庫)都是32位的。以此類推,x64對應的則是64位的。而Any CPU則是取決於當前的操作系統,若操作系統是32位的,則編譯出來的程序就是32位的,反之編譯出來的就是64位程序。
② 若啓動項目,即主程序(編譯出來是exe文件的)是x86平臺下編譯的,而它所依賴的一個項目(或動態鏈接庫)是由x64位平臺編譯出來的,則會提示“未能加載文件或程序集...或它的某一個依賴性。試圖加載格式不正確的程序。”之類的錯誤。這是因爲32位程序不能加載64位的dll,更不能調用其中的類、方法和對象等。反之,若主程序是由x64平臺編譯出來的,而dll是x86的也是不行的!說到這裏,基本上可以確定一點:dll和主程序的生成平臺只要一致就可以。
那麼問題來了!若主程序是Any CPU編譯的,而dll是由x86或者x64平臺編譯的,又或者,主程序是x86或者x64平臺編譯的,而dll是由Any CPU編譯的呢?正確答案就是兩者在“特殊情況”下都是可行的。爲什麼說是“特殊情況”下呢?因爲①處也提到了,Any CPU取決於操作系統,而結合②處提到的,只要dll和主程序的生成平臺一致,那麼也是可行的。所以,由上可知:若主程序是在Any CPU平臺下編譯的,那麼編譯dll的平臺必須要和編譯主程序的操作系統一致才行。若主程序是在x86或者x64平臺下編譯的,那麼dll就必須要和主程序一致。不過有個特例:若dll由Any CPU編譯的,那麼這個dll就可以被32位和64位的主程序調用。這是因爲由Any CPU編譯出來的dll則取決於調用它的主程序,即若主程序是32位的,那麼dll也是32位的,若主程序是64位的,那麼dll就是64位的。所以dll一般採用Any CPU平臺編譯,而主程序一般採用x86平臺編譯。
使用x86平臺調試的時候,是可以一邊調試一邊修改代碼的,而x64平臺下則不行(啓用了編輯並繼續的)。
一般來說,在不清楚目標電腦是什麼類型的操作系統的情況下,或者兩者都有的時候,則主程序採用x86平臺編譯,dll採用Any CPU平臺編譯。若清楚地知道是64位操作系統,那麼就可以都按x64平臺編譯了。
二、Debug和Release的區別
-
Debug通常稱爲調試版本,它包含調試信息,並且不作任何優化,便於程序員調試程序。Release稱爲發佈版本,它往往是進行了各種優化,使得程序在代碼大小和運行速度上都是最優的,以便用戶很好地使用。所以一般都是用Release來打包發佈程序,另外,Release打包出來的程序也相對來說會小一些。
-
在Release模式下是不能一邊調試一邊修改代碼的(啓用了編輯並繼續的)。
參考鏈接:
https://blog.csdn.net/qq_30507287/article/details/51635401
http://www.timegowhere.com/post/about_vs_targetplatform.html