開發內部局域網應用,需支援 Windows XP 到 Windows 7 多種作業系統,專案基於 VS2008/.NET Framework 2.0。由於部分機器未預裝 .NET 2.0,安裝包必須能自動檢測並安裝運行時。經評估三種方案:
原理:安裝啟動時檢查登錄機碼 HKLM\SOFTWARE\Microsoft\.NETFramework\policy\v2.0,若不存在則提示下載安裝。
[Code]
function InitializeSetup: Boolean;
var Path: string; ResultCode: Integer;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\.NETFramework\policy\v2.0') then
Result := True
else if MsgBox('系統檢測到您沒有安裝 .NET Framework 2.0,是否立刻下載並安裝?', mbConfirmation, MB_YESNO) = idYes then
begin
Path := ExpandConstant('{pf}\Internet Explorer\iexplore.exe');
Exec(Path, 'https://www.xxx.com/down/dotnetfx2.exe', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
MsgBox('請安裝好 .NET Framework 2.0 環境後,再運行本安裝包程序!', mbInformation, MB_OK);
Result := False;
end
else
begin
MsgBox('沒有安裝 .NET Framework 2.0 環境,無法運行程式,安裝程序即將退出!', mbInformation, MB_OK);
Result := False;
end;
end;
優點:僅未安裝機器需下載,安裝包體積小。
缺點:離線環境無法安裝(如辦公室下載後帶回家離線電腦)。
將 dotnetfx20.exe (約 22MB) 打包進安裝檔,安裝前解壓至暫存目錄 {tmp} 安裝,重開機自動清理。
[Files]
Source: "F:\Project\dotnetfx20.exe"; DestDir: "{tmp}"; Flags: ignoreversion
[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;
Result := True;
end;
優點:完全離線安裝、用戶無感知。
缺點:安裝包增大 ~22MB(今時今日網速與儲存通常可接受)。
此模式同樣適用於 .NET 3.0/3.5、Java SE 等運行時部署。
Inno Setup 腳本靈活、免費開源,透過登錄檢測與暫存目錄釋放機制,優雅解決 .NET Framework 相依性部署問題。專案來源:周公專欄。