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