日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

用Inno Setup來解決.NetFramework框架安裝問題

 weicat 2010-06-30

前段時(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、Windows2003Windows2008Windows7等,這個(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è)解決方案,代碼如下:

Code:
  1. [code]   
  2.   
  3. function InitializeSetup: Boolean;   
  4.   
  5. var Path:string ;   
  6.   
  7.     ResultCode: Integer;   
  8.   
  9. begin  
  10.   
  11.   if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\.NETFramework\policy\v2.0'then  
  12.   
  13.   begin  
  14.   
  15.     Result := true;   
  16.   
  17.   end  
  18.   
  19.   else  
  20.   
  21.   begin  
  22.   
  23.     if MsgBox('系統(tǒng)檢測(cè)到您沒有安裝.Net Framework2.0,是否立刻下載并安裝?', mbConfirmation, MB_YESNO) = idYes then  
  24.   
  25.     begin  
  26.   
  27.       Path := ExpandConstant('{pf}\Internet Explorer\iexplore.exe');   
  28.   
  29.       Exec(Path, 'http://www./down/dotnetfx2.exe''', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);   
  30.   
  31.       MsgBox('請(qǐng)安裝好.Net Framework2.0環(huán)境后,再運(yùn)行本安裝包程序!',mbInformation,MB_OK);   
  32.   
  33.       Result := false;   
  34.   
  35.     end  
  36.   
  37.     else  
  38.   
  39.     begin  
  40.   
  41.       MsgBox('沒有安裝.Net Framework2.0環(huán)境,無法運(yùn)行XXX程序,本安裝程序即將退出!',mbInformation,MB_OK);   
  42.   
  43.       Result := false;   
  44.   
  45.     end;   
  46.   
  47.   end;   
  48.   
  49. end;  

上面這段代碼的作用是通過檢查注冊(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)鍵代碼:

Code:
  1. [Files]   
  2.   
  3. .........   
  4.   
  5. Source: "F:\周公的專欄\dotnetfx20.exe"; DestDir: "{tmp}"; Flags: ignoreversion   
  6.   
  7. ; 周公的專欄友情提示:dotnetfx20.exe并不會(huì)拷貝到安裝后的目錄中,而是在臨時(shí)目錄中,這樣重啟機(jī)器之后就會(huì)被刪除掉    
  8.   
  9.   
  10. [code]   
  11.   
  12. function CheckDotNet2_0():boolean;   
  13.   
  14. begin  
  15.   
  16. Result:=not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\.NETFramework\policy\v2.0');   
  17.   
  18. end;   
  19.   
  20.   
  21. function InitializeSetup(): Boolean;   
  22.   
  23. var Path:string;   
  24.   
  25.     ResultCode: Integer;   
  26.   
  27. begin  
  28.   
  29.   if CheckDotNet2_0() then  
  30.   
  31.   begin  
  32.   
  33.     ExtractTemporaryFile('dotnetfx20.exe');   
  34.   
  35.     Exec(ExpandConstant('{tmp}\dotnetfx20.exe'), '''', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);   
  36.   
  37.   end;   
  38.   
  39. end;  

通過上面的代碼確保了不會(huì)將dotnetfx20.exe拷貝到安裝后的文件夾中,在Visual StudioInstallShield相信也應(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è)20Mdotnetfx20.exe,不過在網(wǎng)速和存儲(chǔ)設(shè)備都不是問題的今天,這個(gè)不是什么太大的問題,當(dāng)然是有點(diǎn)讓人感覺略微地不爽,可能自己開發(fā)的軟件才數(shù)百K,而必須附帶一個(gè)20Mdotnetfx20.exe。這也是沒有辦法的事情,像早期可以跨*nixWindowsJava和現(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)目。

周公

2010228

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多