C# 關於X86/X64/AnyCpu 的關系


電腦硬件CPU可以分為x86與x64, x86的機器只能安裝32位的操作系統,如XP, WIN7_86, x64的機器既可以安裝32位的系統,又可以安裝64位的系統,只是在x64的機器上安裝32位的系統,不能夠很充分的利用這台機器的資源。x86程序,即適用於32為操作系統的程序,x64即適用於64位操作系統的程序。64位系統上依然可以運行32位的程序,但是這是通過WOW64來運行,通俗上講,就是模擬出一個32位的CPU來運行這個程序。

接下來是C#程序的編譯運行,分為兩步,第一步是編譯成IL,在編寫C#程序的時候,需要考慮到在最終程序需要在哪種環境下運行。Build中默認的環境是Any CPU,還有X86,X64. 這些有什么不同?根據名字,我們可能認為,編譯器會根據選擇的環境不同來生成不同的二進制文件。然而,C#編譯器只是把代碼編譯成為了IL代碼,以dll的形式。然后再程序運行的時候,JIT編譯器才把IL代碼編譯為CPU能夠識別的二進制碼。所以,無論選擇哪個環境,都不會影響dll的生成,只是在dll的頭文件中加入了一些平台信息,最終運行的時候JIT會根據這些信息來編譯dll給CPU處理。

x86編譯的dll和x64編譯的dll是不能相互引用的,否則會拋出程序集不能下載的異常。Any CPU編譯的dll,被哪種類型的程序調用,就會編譯成哪種類型的dll.現在考慮一種情況
A項目是Console Application, B項目是Class Library, 在64位操作系統的機器上。A項目為Start Project,決定了這個程序的32位還是64位的屬性。如果A設置為x86, A決定了這個程序為32位,B設置為x86, 因為兩個項目都是同一類型,雖然都是32位,但可以在64位系統上運行。如果A為Any CPU, B為x86,就會出問題。因為A雖然為Any CPU,但是在64位操作系統上運行,就會轉換成64位的dll,A決定了這個程序為64位,然后再調用32位的dll,就會出問題。如果A為x86, B為Any CPU, 就不會出問題。 因為A決定了這個程序為32位,調用B的時候就會把B轉成32位,一切正常。

有人說,難道不可以一直把Project設置為Any CPU嗎?因為現在很多的系統都是64位的,所以我們的程序設置成Any CPU, 在64位機器上跑的時候就是64位的程序,但是這些程序很多時候需要使用一些組件,比如COM組件等,而這些組件僅僅是32位的dll,根本不支持64位,當我們用64位的程序調用這些dll的時候就會有問題。所以,這時候,我們就需要把我們的程序設置成x86.

那么有人說,那都設置為x86不就可以了?那么現在我們就要保證我們的程序引用的dll都是32位的。雖然很多第三方的dll都提供32位與64位兩個版本,基本上可以保證這一點。但是如果沒有必要做成32位的程序,單純是為了方便,我們前邊說過64位的系統運行32位的程序,效率不高,浪費了我們的資源。
---------------------
作者:孫大誠_SunRobin
來源:CSDN
原文:https://blog.csdn.net/sundacheng1989/article/details/18349503
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

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



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