在32位機器和64位機器上部署的一些區別


      我們平時總聽到說64位的機器,64位的軟件,64位與32位到底有什么區別呢。其實一個完整的64位電腦應用程序應該是這樣的:

      電腦的CPU是64位的,也就是說電腦的硬件支持64位,然后電腦的系統要是64位的,最后應用程序也要是64位的。這樣才能說我的應用程序是在64位模式下運行的,只有這樣才算真正的64位。

      計算機的位數是指CPU一次能處理的最大位數,如果是32位,那么代表寄存器和尋址總線是32位,也就是說一次可以提取32位數據(4個字節,32bit=4Byte)。它能使用的最大虛擬內存就是2^32,也就是4GB的大小。所以32位CPU有4G左右的內存尋址空間。后來由於4GB的虛擬內存空間漸漸的不夠用,64位的個人計算機才慢慢出現(很早以前,64位的機器就已經應用於大型計算機及工作站中),64位也就是意味着寄存器以及尋址總線都是64位的。64 位架構的出現,有效的將內存上限提升至 2^64 地址,16 EB 的內存。(1EB=1024PB,1PB=1024TB,1TB =1024GB)。

     從32位到64位架構的改變是一個根本的改變,大多數操作系統需要進行全面性的修改,才能充分利用64位的性能。以前的應用軟件也需要進行修改,才能應用其新的性能(來自百度百科)。

     一般64位的操作系統能同時支持64位的應用程序以及32位的應用程序。如果我們在項目中引用了第三方組件,而這個第三方組件是分32位和64位的,如果按照以前的方式進行部署,一些功能在64位機器上就不可用。理論上有兩種方法可以解決這個問題。一種是以真64位模式運行,另外一種是假64位模式運行。

64位模式:

      所謂真64位模式運行,也就是編譯的時候,所有的項目都是以AnyCpu的模式進行編譯,如果用到了第三方組件,那么整個程序就要分兩個版本,假如用到了第3方組件SqLite,如果要以真64位模式運行,那么就需要把項目打包成二個版本,一個是專門在64位上安裝的版本,它引用的SqLite也必須是64位的,另一版本是在32位上部署的版本,它引用的SqLite是32位的。編譯好了之后,這只是第一步。第二步(這一步是針對使用了WCF的項目來說的),啟動64位機器上IIS,新建一個應用程序池,設置這個應用程序池的屬性,把“啟用32位應用程序”設置為False(默認本身是False),然后設置WCF的應用程序池為你剛才新建的那個應用程序池。

clip_image002

       這樣就可以在瀏覽器中查看WCF服務了。但是在程序運行的時候,又出現錯誤。

“嘗試加載 Oracle 客戶端庫時引發 BadImageFormatException。如果在安裝 32 位 Oracle 客戶端組件的情況下以 64 位模式運行,將出現此問題”

      因為我的機器上安裝的是32位的Oracle服務器,客戶端也是32位的,所以會出現這個錯誤。如果安裝的是64位的Oracle服務器以及客戶端,應該不會出現這樣的問題。這樣整個應用程序就是真正的64位模式運行了。

      后來想,能不能直接連接32位的Oracel服務器呢?下載一個64位的客戶端,連接32位的服務器,這樣整個程序也是真正的64位模式運行,只不過數據庫服務器不是64位的。

      這種方式有兩個問題沒有解決,所以最后沒有嘗試。

      一是64位的客戶端沒有下載到,網上的鏈接都失效,另外由於我這網速很慢,Oracle官網登錄不上去,所以就放棄了。

      二是沒有測試過用64位的Oracle客戶端能不能連接32位的Oracle服務器?這個問題在網上沒有找到答案,也沒有真正試過。

      所以最終以真正64位模式運行的計划只好放棄了。以后有時間再嘗試。

64位模式:

      所謂假64位,也就是在64位機器上以32位模式運行程序,這樣不管你的程序引用了沒有第三方組件,都沒有問題,只是要改變一下編譯的方式。所有引用了第三方組件SqLite的,我們只需要引用32位的SqLite,但需要把引用這個組件的項目的編譯方式改成為X86的方式進行編譯。(注意,凡是引用了這個組件的其他項目,都需要以X86的模式運行)。

     在部署WCF服務的時候,為WCF選擇一個應用程序池(可以使用默認的應用程序池,也可以自己新建一個應用程序池),但需要注意的是,需要把這個應用程序池的“啟用32位應用程序”屬性設置為True(跟上面的恰好相反)

clip_image003

這樣整個應用程序就可以運行了。

AnyCpu,X86,X64編譯平台的不同(純屬個人理解):

      我們知道在編譯項目的時候,編譯平台有三個選項,分別是AnyCpu,X86,X64,默認選擇的是AnyCpu。它們三者的區別是什么呢,下面做一個簡單的介紹:

      我們知道在.NET平台下面開發的應用程序,經過編譯之后,變成了一種稱為“IL”的中間語言(類似於Jave中的字節碼),在執行的時候,通過即時編譯器(JIT),再把IL轉換成對應CPU可以執行的二進制代碼。

      如果是以AnyCpu進行編譯的話,那么程序不管部署在哪個電腦上,在運行的時候,JIT會根據你的CPU的類型來生成對應的二進制代碼,32位的CPU就生成32位的二進制代碼,64位的就生成64位的二進制代碼。

      如果是以X86模式進行編譯的話,那么程序不管部署在哪個電腦上,在運行的時候,JIT都會把IL代碼轉換成32位CPU執行的二進制代碼。

      如果是以X64模式進行編譯的話,那么程序不管部署在哪個電腦上,在運行的時候,JIT都會把IL代碼轉換成64位CPU執行的二進制代碼。


免責聲明!

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



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