关于.NET编译的目标平台(AnyCPU,x86,x64)
在VisualStudio中項目平臺屬性包含x86/x64/AnyCPU三個選項,之前的項目中并沒有特別去關注這一點,最近的項目中涉及到了在不同平臺運行的問題,所以專門了解并整理了這方面的知識。
x86/x64/AnyCPU的含義
 在vs中這一選項被稱為“目標平臺”,也就是編譯成功的項目最終是要在什么平臺上運行。?
 編譯(目標)平臺?? ?含義
 x86?? ?將程序集編譯為由兼容 x86 的 32 位公共語言運行庫運行;
 x64?? ?將程序集編譯為由支持 AMD64 或 EM64T 指令集的計算機上的 64 位公共語言運行庫運行;
 AnyCPU?? ?(默認值)將程序集編譯為在任意平臺上運行。
 x86/x64/AnyCPU的區(qū)別
 我們使用.NET平臺開發(fā)程序所構(gòu)造的項目被稱為“程序集”,程序集的輸出類型有Windows應用程序、控制臺應用程序、類庫。使用頻率較高的是Windows應用程序和類庫。Windows應用程序一般包括我們常見的WinForm、WPF程序,文件格式通常為可執(zhí)行文件(.exe);類庫一般是WEB程序或動態(tài)鏈接庫,文件格式通常為.dll。?
 關于x86/x64/AnyCPU之間的區(qū)別,我們就看一看exe和dll兩類文件在不同平臺的操作系統(tǒng)上運行的結(jié)果。
x86操作系統(tǒng)
 目標平臺?? ?程序類型?? ?運行結(jié)果
 x86?? ?應用程序exe?? ?在32位CLR上運行
 x86?? ?類庫dll?? ?在32位CLR上運行
 x64?? ?應用程序exe?? ?無法運行
 x64?? ?類庫dll?? ?無法運行
 AnyCPU?? ?應用程序exe?? ?在32位CLR上運行
 AnyCPU?? ?類庫dll?? ?在32位CLR上運行
 x64操作系統(tǒng)
 目標平臺?? ?程序類型?? ?運行結(jié)果
 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上運行
 從上面的運行結(jié)果來看我們可以基本確定一個結(jié)論:
主程序和其引用的類庫在運行時的平臺應該保持一致。
不過這樣理解起來還是有些問題,我們舉幾個例子:?
 1. AnyCPU的應用程序+AnyCPU的類庫?
 在x86的操作系統(tǒng)上,應用程序會在32位CLR上運行,所以它引用的類庫也會在32位CLR上運行;?
 在x64操作系統(tǒng)上,應用程序許會在64位CLR上運行,所以它引用的類庫也會在64為CLR上運行。?
 2. x86的應用程序+AnyCPU的類庫?
 在x86的操作系統(tǒng)上,應用程序會在32位CLR上運行,它引用的類庫也會在32位CLR上運行;?
 在x64的操作系統(tǒng)上,應用程序會在WOW下的32位CLR上運行,它引用的類庫也會在WOW下的332位CLR上運行。?
 3. x64的應用程序+AnyCPU的類庫?
 在x86的操作系統(tǒng)上,應用程序無法運行,更不要說引用類庫了;?
 在x64的操作系統(tǒng)上,應用程序會在64位CLR上運行,引用的類庫也會在64位CLR上運行。?
 4. AnyCPU的應用程序+x64的類庫?
 在x86的操作系統(tǒng)上,應用程序會在32位CLR上運行,但引用的類庫無法在32為CLR上運行,程序報錯;?
 在x64的操作系統(tǒng)上,應用程序會在64位CLR上運行,引用的類庫也會在64位CLR上運行。?
 5. AnyCPU的應用程序+x86的類庫?
 在x86的操作系統(tǒng)上,應用程序會在32位CLR上運行,引用的類庫也會在32位CLR上運行;?
 在x64的操作系統(tǒng)上,應用程序會在64位CLR上運行,但引用的類庫無法在64位CLR上運行。
有了以上的例子,是不是有點明白了?當然我們的主程序并不限于應用程序exe,不要忘了常見的Web應用的主程序就是類庫,不過原理還是一樣的:主程序和引用類庫在運行時的平臺要保持一致。
一般來講,我們可以把主程序的目標平臺根據(jù)實際需求設置為跟部署的操作系統(tǒng)一致,類庫最好是AnyCPU。當然特殊的部署環(huán)境還要特殊考慮。
 ---------------------?
 作者:ludewig?
 來源:CSDN?
 原文:https://blog.csdn.net/lordwish/article/details/52312015?
 版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的关于.NET编译的目标平台(AnyCPU,x86,x64)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: GCC 命令选项使用详解
- 下一篇: 架构师之路
