關於C#編寫x86與x64程序的分析

電腦硬件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。ui

如今考慮一種狀況
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位的程序,效率不高,浪費了咱們的資源。操作系統

相關文章
相關標籤/搜索