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

原文轉載於:https://blog.csdn.net/g710710/article/details/23161807

觀點一:

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

今天有項目的代碼收到客戶的反饋,要求所有的EXE工程的目標平臺全部指定成x86,而所有DLL工程的目標平臺全部指定成AnyCPU 。

 

下面我們一起看看這個目標平臺有什麼作用,各選項有什麼差別吧。

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

 

x86: 將程序集編譯爲由兼容 x86 的 32 位公共語言運行庫運行。

x64: 將程序集編譯爲由支持 AMD64 或 EM64T 指令集的計算機上的 64 位公共語言運行庫運行。

anycpu:(默認值)將程序集編譯爲在任意平臺上運行。

Itanium: 將程序集編譯爲由採用 Itanium 處理器的計算機上的 64 位公共語言運行庫運行。

 

具體行爲如下:

在 64 位 Windows 操作系統上:

用 x86 編譯的程序集將在 WOW64 下運行的 32 位 CLR 上執行。

用 x64 編譯的程序集將在 64 位 CLR 上執行。

用 anycpu 編譯的可執行文件將在 64 位 CLR 上執行。

用 anycpu 編譯的 DLL 將在與加載它的進程相同的 CLR 上執行。

 

在 32 位 Windows 操作系統上:

用 x86或anycpu 編譯的程序集將在 32 位 CLR 上執行。

用 x64 編譯的程序集無法運行。

 

搞清楚這些差異以後,回過頭來看看客戶要求的東西,有沒有道理吧。

首先有一點是知道的,客戶希望程序能夠在WINXP以上的各系統中運行(不管是32位還是64位)。

因此,不可能選x64,Itanium這種針對特殊處理器的也不會去選。

 

那都選擇Any CPU這種默認方式有沒有問題呢?

首先看看Any CPU和x86的可執行文件(EXE)在32位和64位下有什麼區別吧,

Any CPU在32位下,EXE將以32位執行,而在64位下,EXE將以64位執行。而x86的話,始終以32位執行。

客戶希望使用的x86,也就是不希望64位下用64位方式執行EXE程序。我分析的原因是由於系統中可能存在第三方的32位DLL,一旦使用64位執行的EXE,在調用到32位的DLL時,將無法調用。

 

而DLL,客戶則希望採用Any CPU,我分析的原因是DLL的實際運行方式是受調用它的EXE所影響的,因此設爲Any CPU就可以了。而如果設定爲x86,雖然看似沒什麼問題,但其無法在64位CLR中運行了,不是太好。

 

參考資料:

http://msdn.microsoft.com/zh-cn/library/zekwfyz4(VS.80).aspx

注:以上文章雖好,但是我在做項目的時候,用any CPU編譯的exe,調用64位系統上的dll的時候,總是調不起來,後來用x86編譯的exe就可以調用64位系統上的dll。所以要是在64爲系統上運行,用x86編譯的是幾乎都能運行的。

 

2.如果是c++程序在64位系統上運行,記得安裝開發工具是要自己勾選上,默認是不安裝的。

 

觀點二:

VS 的編譯選項 build下的platform -- Any CPU和x86有什麼影響?

現在的問題是,我的一個assembly用Any CPU編譯就不能在64位系統下運行了,但是用x86編譯就ok

 

原因是如果用Any CPU編譯,那麼在64位機器默認的運行就是64位的,

而我的assembly需要調用一個32的COM庫,所以就運行不起來

只要用x86編譯,那麼程序就是以32位的程序,依靠wow64來運行的,所以就ok

 

所以,如果assembly需要使用win32庫的話,

那麼編譯選項就不能使用默認的Any CPU了需要注意

 

我去,ANY CPU的意思不是任何CPU都可以用,而是當前編譯的這臺機子的環境可用

 

 

大家可再瞭解一下

Mixed Platform vs Any CPU

 

 Team Build deals with solution configurations - these are the platforms (e.g. .NET or Win32) and configurations (e.g. Debug or Release) you typically see in combo boxes within Visual Studio when you have a solution loaded (if you hover over these boxes the tooltips will say "Solution Platforms" and "Solution Configurations", respectively).  When all of the projects in a solution are of the same type (e.g. C#/VB projects) the solution configurations will match up exactly with the project configurations.  Once you have projects in a solution that have mismatched configurations/platforms, Visual Studio creates the solution level configuration(s) "Mixed Platforms/Debug" and possibly "Mixed Platforms/Release".  These configurations are just mappings to individual project level configurations.

      For example, if you have a C# project and a C++ project, typically "Mixed Platforms/Debug" will map to "Any CPU/Debug" for the C# project and "Win32/Debug" for the C++ project.  

      To see these mappings, open up the Configuration Manager (either through the Build menu or by clicking on the platform or configuration combo box and selecting Configuration Manager...).  You should see combo boxes for the Active solution configuration and the Active solution platform and then a table showing you the project level mappings.  This will show you the platform generated for each project under each solution configuration.

 

觀點三:

一般來說包括但不侷限於以下:

x86: 將程序集編譯爲由兼容 x86 的 32 位公共語言運行庫(CLR)運行。
x64: 將程序集編譯爲由支持 AMD64EM64T 指令集的計算機上的 64 位公共語言運行庫(CLR)運行。
AnyCPU:(默認值)將程序集編譯爲在任意平臺上運行。
Itanium: 將程序集編譯爲由採用 Itanium 處理器的計算機上的 64
公共語言運行庫(CLR)運行。
.NET:將程序集編譯爲只在公共語言運行庫(CLR)運行。
Mixed Platforms:將程序集編譯爲可在對應的平臺上運行(C#、VB.NET 對應 CLR,C++ 對應 Win32)。
Win32:此選項只會出現在 C++ 項目中。

一般來說沒特殊需要, AnyCPU 就好。

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