程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 用Inno Setup來解決.NetFramework安裝問題

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

編輯:關於.NET

前段時間朋友接了一個項目,具體是開發一個安裝在局域網內的軟件,這個 軟件會定時連接局域網內的服務器來更新本地客戶端的一些信息,因為在局域網 內存在著多種不同的Windows版本,從WindowsXP、Windows2003及Windows2008到 Windows7等,這個軟件采用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 Studio和InstallShield相信也應該會有這樣的功能,只是筆者沒有找到 ,這個功能我覺得比較實用,如果客戶機器上已經安裝了.Net Framework2.0的 話不會在安裝時不會感覺到有什麼,如果沒有安裝就會將dotnetfx20.exe釋放到 臨時文件夾下,並從臨時文件夾下安裝.Net Framework2.0,這樣確保 dotnetfx20.exe不會占用安裝文件夾的空間。這樣制作安裝包的好處是在安裝軟 件時無需擔心用戶是否聯網,缺點是使安裝文件略顯有點大,因為制作的安裝包 中要包含一個20多M的dotnetfx20.exe,不過在網速和存儲設備都不是問題的今 天,這個不是什麼太大的問題,當然是有點讓人感覺略微地不爽,可能自己開發 的軟件才數百K,而必須附帶一個20多M的dotnetfx20.exe。這也是沒有辦法的事 情,像早期可以跨*nix和Windows的Java和現在可以跨不同版本的.NET,為了實 現在不同平台上有相同的表現,就必須要運行時的支持,正所謂熊掌魚肉不可兼 得,雖然有些第三方開發的軟件可以將Java或者.NET平台上的軟件制作成無需運 行時支持的exe文件,但是能否在各個平台上得到一致的表現,有待考證。

其實這種做法不僅可以用於檢測.Net Framework2.0的情況,也可以用於其它 情況,比如檢測.Net Framework3.0或者.Net Framework3.5的情況,特別是當你 向朋友展示你開發的WPF應用時;此外,還可以用於部署Java SE項目。

出處http://zhoufoxcn.blog.51cto.com/792419/279243

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved