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

>>>  技術話題—商業文明的嶄新時代  >>> 簡體     傳統

前段時間朋友接了一個項目,具體是開發一個安裝在局域網內的軟件,這個軟件會定時連接局域網內的服務器來更新本地客戶端的一些信息,因為在局域網內存在著多種不同的Windows版本,從WindowsXPWindows2003Windows2008Windows7等,這個軟件采用VS2008/.Net Framework2.0開發,因為有些系統默認沒有安裝.Net Framework2.0,所以在運行時需要確保客戶機上已經安裝上.Net Framework2.0,于是想到將軟件打包。制作軟件安裝包有幾種工具和方案:一是利用Visual Studio自帶的安裝包制作工具;二是利用InstallShield這類收費的、專業的安裝包制作工具;三是利用Inno Setup這類免費的、專業的安裝包制作工具。Visual Studio自帶的安裝包制作工具研究得不深,早期曾經嘗試過將軟件打包成一個安裝文件內,不過最終失敗了,后來干脆就不再研究了;InstallShield這類收費的安裝包制作軟件功能確實強大,不過上手確實也不容易,再加上是收費的(盡管可以找到破解版,但是總覺得不爽),于是轉而尋求利用Inno Setup來解決。Inno Setup 是一個免費的 Windows 安裝程序制作軟件,它支持現在所有正在使用的 Windows 版本: 7, 2008 R2, Vista, XP, 2008, 2003, 2000, Me, 98, 95, 和 NT 4.0 (不需要服務包)。 并且Inno Setup最早出現在1997年,是一個免費開源的軟件,即使作為商業使用也是如此。Inno Setup的官方網站網址是http://www.jrsoftware.org,當然也可以下載它的中文版本,比如[楓林夜思雨]漢化的Inno Setup就還不錯,我給朋友打包時用的是英文版Inno Setup文件,只不過安裝文件中用到的.isl文件被我翻譯成中文了。我們想到的辦法就是將軟件制作成安裝包,運行安裝包的時候會檢查客戶機上是否安裝了.Net Framework2.0,如果沒有則從局域網內服務器上下載.Net Framework2.0安裝文件安裝,然后繼續安裝和配置開發的軟件。從網上搜到這個一個解決方案,代碼如下:  [code]
  function InitializeSetup: Boolean;
  var Path:string ;
         ResultCode: Integer;
  begin
     if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\.NETFramework\policy\v2.0') then
     begin
         Result := true;
     end
     else
     begin
         if MsgBox('系統檢測到您沒有安裝.Net Framework2.0,是否立刻下載并安裝?', mbConfirmation, MB_YESNO) = idYes then
         begin
             Path := ExpandConstant('{pf}\Internet Explorer\iexplore.exe');
             Exec(Path, 'http://www.xxx.com/down/dotnetfx2.exe', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
             MsgBox('請安裝好.Net Framework2.0環境后,再運行本安裝包程序!',mbInformation,MB_OK);
             Result := false;
         end
         else
         begin
             MsgBox('沒有安裝.Net Framework2.0環境,無法運行XXX程序,本安裝程序即將退出!',mbInformation,MB_OK);
             Result := false;
         end;
     end;
  end;上面這段代碼的作用是通過檢查注冊表來判斷客戶機上是否安裝了.Net Framework2.0,如果沒有就從http://www.xxx.com/down/dotnetfx2.exe處下載,并提示用戶安裝下載的.Net Framework2.0的程序之后再安裝本程序。這么做有一個優點,因為并不是所有的機器都沒有安裝.Net Framework2.0,所以僅僅是一部分沒有安裝的機器才會需要下載,這樣也就不需要將.Net Framework2.0打包進安裝包,是安裝包比較小。不過這樣在某些情況下也會出現問題,比如開發了一個不錯的軟件,用戶在辦公室里上網并下載和安裝了這個軟件,覺得不錯,拷貝到家里沒有上網的機器上時就不能安裝和使用了,這樣麻煩就來了。因此下面想到了另一種解決辦法,這種辦法就是將.Net Framework2.0打包進安裝文件,在安裝開始之前檢查客戶機上是否安裝了.Net Framework2.0,如果沒有安裝就將.Net Framework2.0安裝文件從安裝包里解壓縮出來到臨時文件夾下并從臨時文件夾下安裝,否則就直接安裝開發后的軟件,臨時文件夾下的文件會在系統重新系統啟動時被自動清理,不用担心占用磁盤空間。以下是部分關鍵代碼: [Files]
.........
Source: "F:\周公的專欄\dotnetfx20.exe"; DestDir: "{tmp}"; Flags: ignoreversion
; 周公的專欄友情提示:dotnetfx20.exe并不會拷貝到安裝后的目錄中,而是在臨時目錄中,這樣重啟機器之后就會被刪除掉    

[code]
function CheckDotNet2_0():boolean;
begin
Result:=not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\.NETFramework\policy\v2.0');
end;

function InitializeSetup(): Boolean;
var Path:string;
        ResultCode: Integer;
begin
    if CheckDotNet2_0() then
    begin
        ExtractTemporaryFile('dotnetfx20.exe');
        Exec(ExpandConstant('{tmp}\dotnetfx20.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
    end;
end;通過上面的代碼確保了不會將dotnetfx20.exe拷貝到安裝后的文件夾中,在Visual StudioInstallShield相信也應該會有這樣的功能,只是筆者沒有找到,這個功能我覺得比較實用,如果客戶機器上已經安裝了.Net Framework2.0的話不會在安裝時不會感覺到有什么,如果沒有安裝就會將dotnetfx20.exe釋放到臨時文件夾下,并從臨時文件夾下安裝.Net Framework2.0,這樣確保dotnetfx20.exe不會占用安裝文件夾的空間。這樣制作安裝包的好處是在安裝軟件時無需担心用戶是否聯網,缺點是使安裝文件略顯有點大,因為制作的安裝包中要包含一個20Mdotnetfx20.exe,不過在網速和存儲設備都不是問題的今天,這個不是什么太大的問題,當然是有點讓人感覺略微地不爽,可能自己開發的軟件才數百K,而必須附帶一個20Mdotnetfx20.exe。這也是沒有辦法的事情,像早期可以跨*nixWindowsJava和現在可以跨不同版本的.NET,為了實現在不同平臺上有相同的表現,就必須要運行時的支持,正所謂熊掌魚肉不可兼得,雖然有些第三方開發的軟件可以將Java或者.NET平臺上的軟件制作成無需運行時支持的exe文件,但是能否在各個平臺上得到一致的表現,有待考證。其實這種做法不僅可以用于檢測.Net Framework2.0的情況,也可以用于其它情況,比如檢測.Net Framework3.0或者.Net Framework3.5的情況,特別是當你向朋友展示你開發的WPF應用時;此外,還可以用于部署Java SE項目。周公2010228

本文出自 “周公(周金橋)的專欄” 博客,請務必保留此出處http://zhoufoxcn.blog.51cto.com/792419/279243


網載 2015-05-18 09:58:40

[新一篇] 記一次手游創業歷程(16-大結局)轉身立定呻吟著

[舊一篇] 使用win8.1自帶命令清除系統冗余垃圾
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表