前段時間朋友接了一個項目,具體是開發(fā)一個安裝在局域網(wǎng)內的軟件,這個軟件會定時連接局域網(wǎng)內的服務器來更新本地客戶端的一些信息,因為在局域網(wǎng)內存在著多種不同的Windows版本,從WindowsXP、Windows2003及Windows2008到Windows7等,這個軟件采用VS2008/.Net Framework2.0開發(fā),因為有些系統(tǒng)默認沒有安裝.Net Framework2.0,所以在運行時需要確??蛻魴C上已經(jīng)安裝上.Net Framework2.0,于是想到將軟件打包。
制作軟件安裝包有幾種工具和方案:一是利用Visual Studio自帶的安裝包制作工具;二是利用InstallShield這類收費的、專業(yè)的安裝包制作工具;三是利用Inno Setup這類免費的、專業(yè)的安裝包制作工具。
對Visual Studio自帶的安裝包制作工具研究得不深,早期曾經(jīng)嘗試過將軟件打包成一個安裝文件內,不過最終失敗了,后來干脆就不再研究了;InstallShield這類收費的安裝包制作軟件功能確實強大,不過上手確實也不容易,再加上是收費的(盡管可以找到破解版,但是總覺得不爽),于是轉而尋求利用Inno Setup來解決。
Inno Setup 是一個免費的 Windows 安裝程序制作軟件,它支持現(xiàn)在所有正在使用的 Windows 版本: 7, 2008 R2, Vista, XP, 2008, 2003, 2000, Me, 98, 95, 和 NT 4.0 (不需要服務包)。 并且Inno Setup最早出現(xiàn)在1997年,是一個免費開源的軟件,即使作為商業(yè)使用也是如此。Inno Setup的官方網(wǎng)站網(wǎng)址是http://www.jrsoftware.org,當然也可以下載它的中文版本,比如[楓林夜思雨]漢化的Inno Setup就還不錯,我給朋友打包時用的是英文版Inno Setup文件,只不過安裝文件中用到的.isl文件被我翻譯成中文了。
我們想到的辦法就是將軟件制作成安裝包,運行安裝包的時候會檢查客戶機上是否安裝了.Net Framework2.0,如果沒有則從局域網(wǎng)內服務器上下載.Net Framework2.0安裝文件安裝,然后繼續(xù)安裝和配置開發(fā)的軟件。
從網(wǎng)上搜到這個一個解決方案,代碼如下:
上面這段代碼的作用是通過檢查注冊表來判斷客戶機上是否安裝了.Net Framework2.0,如果沒有就從http://www.xxx.com/down/dotnetfx2.exe處下載,并提示用戶安裝下載的.Net Framework2.0的程序之后再安裝本程序。這么做有一個優(yōu)點,因為并不是所有的機器都沒有安裝.Net Framework2.0,所以僅僅是一部分沒有安裝的機器才會需要下載,這樣也就不需要將.Net Framework2.0打包進安裝包,是安裝包比較小。
不過這樣在某些情況下也會出現(xiàn)問題,比如開發(fā)了一個不錯的軟件,用戶在辦公室里上網(wǎng)并下載和安裝了這個軟件,覺得不錯,拷貝到家里沒有上網(wǎng)的機器上時就不能安裝和使用了,這樣麻煩就來了。因此下面想到了另一種解決辦法,這種辦法就是將.Net Framework2.0打包進安裝文件,在安裝開始之前檢查客戶機上是否安裝了.Net Framework2.0,如果沒有安裝就將.Net Framework2.0安裝文件從安裝包里解壓縮出來到臨時文件夾下并從臨時文件夾下安裝,否則就直接安裝開發(fā)后的軟件,臨時文件夾下的文件會在系統(tǒng)重新系統(tǒng)啟動時被自動清理,不用擔心占用磁盤空間。
以下是部分關鍵代碼:
通過上面的代碼確保了不會將dotnetfx20.exe拷貝到安裝后的文件夾中,在Visual Studio和InstallShield相信也應該會有這樣的功能,只是筆者沒有找到,這個功能我覺得比較實用,如果客戶機器上已經(jīng)安裝了.Net Framework2.0的話不會在安裝時不會感覺到有什么,如果沒有安裝就會將dotnetfx20.exe釋放到臨時文件夾下,并從臨時文件夾下安裝.Net Framework2.0,這樣確保dotnetfx20.exe不會占用安裝文件夾的空間。這樣制作安裝包的好處是在安裝軟件時無需擔心用戶是否聯(lián)網(wǎng),缺點是使安裝文件略顯有點大,因為制作的安裝包中要包含一個20多M的dotnetfx20.exe,不過在網(wǎng)速和存儲設備都不是問題的今天,這個不是什么太大的問題,當然是有點讓人感覺略微地不爽,可能自己開發(fā)的軟件才數(shù)百K,而必須附帶一個20多M的dotnetfx20.exe。這也是沒有辦法的事情,像早期可以跨*nix和Windows的Java和現(xiàn)在可以跨不同版本的.NET,為了實現(xiàn)在不同平臺上有相同的表現(xiàn),就必須要運行時的支持,正所謂熊掌魚肉不可兼得,雖然有些第三方開發(fā)的軟件可以將Java或者.NET平臺上的軟件制作成無需運行時支持的exe文件,但是能否在各個平臺上得到一致的表現(xiàn),有待考證。
其實這種做法不僅可以用于檢測.Net Framework2.0的情況,也可以用于其它情況,比如檢測.Net Framework3.0或者.Net Framework3.5的情況,特別是當你向朋友展示你開發(fā)的WPF應用時;此外,還可以用于部署Java SE項目。
周公
2010年2月28日