.Net編譯環境x86,x64,anycpu的區別


一、定義

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 編譯的程序集無法運行。

三、AnyCPU(Prefer 32-bit)(看了waterlv,大水哥的博文)

這是在右擊屬性,選擇首選32位才會使用的方法,必須使用 .net framework 4.5 以上才可以使用。在這個編譯下,程序運行都是 32 位。

在 32 位系統下,運行 32 位程序

在 64 位系統下,運行 32 位程序,但是可以獲得 4G 內存

在 ARM 下,運行 32 位程序

如果使用 AnyCPU 那么編譯為 IL 是不需要加平台,程序在機器運行才判斷機器平台,自動編譯為機器可以運行的程序。

那么 AnyCPU(Prefer 32-bit) 和 x86 有什么區別?實際上在 ARM 系統,只能使用 AnyCPU(Prefer 32-bit) 運行 32 位程序,如果選擇 x86 就無法運行。

為什么需要在 64 位的設備使用 AnyCPU(Prefer 32-bit),因為如果存在一些庫只能在 32位程序運行,那么就需要運行的程序是 32 位,所以需要使用這個方法。

如果在運行的時候,如何判斷當前的系統版本?

可以使用 Environment 來判斷,Environment.Is64BitProcess 可以判斷當前的程序運行的是 32 還是 64 ,通過 Environment.Is64BitOperatingSystem 可以判斷系統

那么如何判斷一個 dll 是 x86 還是 any cpu?

可以打開開發者命令,然后輸入 corflags 判斷,開發者命令一般如果是安裝 vs2017 就是Developer Command Prompt for VS 2017,通過開始就可以找到。

corflags lindexi.dll

看輸出,就可以知道這個庫是什么

Any CPU:

PE: PE32 32BIT: 0

x86:

PE: PE32 32BIT: 1

x64:

PE: PE32+ 32BIT: 0

四、其他編譯選擇

  • anycpu 默認的編譯
  • anycpu32bitpreferred 在 .NET Framework 4.5 和以上才可以使用
  • ARM 程序編譯為 ARM 運行
  • x64
  • x86
  • Itanium

如果使用命令編譯,那么可以使用platform和字符串

csc /platform:anycpu filename.cs 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM