標籤:環境 library x86 選擇 tar x64 build 編寫 不同的
電腦硬體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位的程式,效率不高,浪費了我們的資源。
關於C#編寫x86與x64程式的分析