關於VS項目平臺的x86,x64,Any CPU以及Debug和Release

一、x86、x64、Any CPU的區別 

1、在VisualStudio中,在編譯設置中有如下選項:

編譯(目標)平臺 含義
x86 將程序集編譯爲由兼容 x86 的 32 位公共語言運行庫運行;
x64 將程序集編譯爲由支持 AMD64 或 EM64T 指令集的計算機上的 64 位公共語言運行庫運行;
AnyCPU (默認值)將程序集編譯爲在任意平臺上運行。

2、具體行爲如下:

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上運行

說明:

① 簡單的說,它們之間最直接的區別就是: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的區別

  1. Debug通常稱爲調試版本,它包含調試信息,並且不作任何優化,便於程序員調試程序。Release稱爲發佈版本,它往往是進行了各種優化,使得程序在代碼大小和運行速度上都是最優的,以便用戶很好地使用。所以一般都是用Release來打包發佈程序,另外,Release打包出來的程序也相對來說會小一些。

  2. 在Release模式下是不能一邊調試一邊修改代碼的(啓用了編輯並繼續的)。

 

參考鏈接:

https://blog.csdn.net/qq_30507287/article/details/51635401

http://www.timegowhere.com/post/about_vs_targetplatform.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章