檢測Miscrosoft .NET Framework並打包多個exe程序實現一鍵安裝
背景
- 當你需要安裝多個應用,而又不想一個一個點擊的時候,如何來實現打包多個exe程序並實現一鍵安裝;
- 當你的程序依賴Miscrosoft .NET Framework版本時,如何檢測是否安裝或版本安裝是否符合預期?
- 當不符合預期的時候,如何實現自動安裝Miscrosoft .NET Framework版本?
實現步驟
工具
Inno Setup:
https://jrsoftware.org/isinfo.php
Miscrosoft .NET Framework:
https://www.microsoft.com/zh-cn/download/details.aspx?id=17718
打包
- 啟動Inno Setup, 如下圖
- 傻瓜式一步一步往下走即可,最后會生成一個iss文件,編譯完成即可生成打包的程序
- 參考iss文件的幫助文檔,可對iss打包內容進行擴展
如
- ; 注釋
- [Setup]區段 安裝配置
- [Files]區段 文件安裝
- [run]區段是可選的,用來指定在程序完成安裝后,在安裝程序顯示最終對話框前要執行的一些程序; 打包多個exe時,可按順序在此處一次實現靜默安裝
- 靜默安裝參考:https://www.cnblogs.com/pengsn/p/12986956.html
Miscrosoft .NET Framework 檢測
- [Files] 可以將依賴文件打入exe中
[Files]
Source: "NDP452-KB2901907-x86-x64-AllOS-ENU.exe"; DestDir: "{app}" ;
Source: "VideoClient1.0.exe"; DestDir: "{app}" ;
- 檢測代碼如下
[Code]
function IsDotNetDetected(version: string; service: cardinal): boolean;
var
key, versionKey: string;
install, release, serviceCount, versionRelease: cardinal;
success: boolean;
begin
versionKey := version;
versionRelease := 0;
// .NET 1.1 and 2.0 embed release number in version key
if version = 'v1.1' then begin
versionKey := 'v1.1.4322';
end else if version = 'v2.0' then begin
versionKey := 'v2.0.50727';
end
// .NET 4.5 and newer install as update to .NET 4.0 Full
else if Pos('v4.', version) = 1 then begin
versionKey := 'v4\Full';
case version of
'v4.5': versionRelease := 378389;
'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older
'v4.5.2': versionRelease := 379893;
'v4.6': versionRelease := 393295; // 393297 on Windows 8.1 and older
'v4.6.1': versionRelease := 394254; // 394271 on Windows 8.1 and older
'v4.6.2': versionRelease := 394802; // 394806 on Windows 8.1 and older
end;
end;
// installation key group for all .NET versions
key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey;
// .NET 3.0 uses value InstallSuccess in subkey Setup
if Pos('v3.0', version) = 1 then begin
success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
end else begin
success := RegQueryDWordValue(HKLM, key, 'Install', install);
end;
// .NET 4.0 and newer use value Servicing instead of SP
if Pos('v4', version) = 1 then begin
success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
end else begin
success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
end;
// .NET 4.5 and newer use additional value Release
if versionRelease > 0 then begin
success := success and RegQueryDWordValue(HKLM, key, 'Release', release);
success := success and (release >= versionRelease);
end;
result := success and (install = 1) and (serviceCount >= service);
end;
- 安裝Miscrosoft .NET Framework
ExtractTemporaryFile('NDP452-KB2901907-x86-x64-AllOS-ENU.exe');
Exec(ExpandConstant('{tmp}\NDP452-KB2901907-x86-x64-AllOS-ENU.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
完整代碼
; -- psn.iss --
; Demonstrates copying 2 files
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES!
;
[Setup]
AppName=VideoClient
AppVersion=1.0
WizardStyle=modern
DefaultDirName={autopf}\VideoClient
DefaultGroupName=VideoClient
UninstallDisplayIcon={app}\VideoClient1.0.exe
Compression=lzma2
SolidCompression=yes
AlwaysRestart=no
OutputDir=userdocs:Inno Setup Examples Output
[Files]
Source: "NDP452-KB2901907-x86-x64-AllOS-ENU.exe"; DestDir: "{app}" ;
Source: "VideoClient1.0.exe"; DestDir: "{app}" ;
[run]
Filename: "{app}\VideoClient1.0.exe";Parameters:"/sp- /silent /norestart"; Flags: hidewizard;
[Icons]
Name: "{group}\VideoClient1.0.exe"; Filename: "{app}\VideoClient1.0.exe"
[Code]
function IsDotNetDetected(version: string; service: cardinal): boolean;
var
key, versionKey: string;
install, release, serviceCount, versionRelease: cardinal;
success: boolean;
begin
versionKey := version;
versionRelease := 0;
// .NET 1.1 and 2.0 embed release number in version key
if version = 'v1.1' then begin
versionKey := 'v1.1.4322';
end else if version = 'v2.0' then begin
versionKey := 'v2.0.50727';
end
// .NET 4.5 and newer install as update to .NET 4.0 Full
else if Pos('v4.', version) = 1 then begin
versionKey := 'v4\Full';
case version of
'v4.5': versionRelease := 378389;
'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older
'v4.5.2': versionRelease := 379893;
'v4.6': versionRelease := 393295; // 393297 on Windows 8.1 and older
'v4.6.1': versionRelease := 394254; // 394271 on Windows 8.1 and older
'v4.6.2': versionRelease := 394802; // 394806 on Windows 8.1 and older
end;
end;
// installation key group for all .NET versions
key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey;
// .NET 3.0 uses value InstallSuccess in subkey Setup
if Pos('v3.0', version) = 1 then begin
success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
end else begin
success := RegQueryDWordValue(HKLM, key, 'Install', install);
end;
// .NET 4.0 and newer use value Servicing instead of SP
if Pos('v4', version) = 1 then begin
success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
end else begin
success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
end;
// .NET 4.5 and newer use additional value Release
if versionRelease > 0 then begin
success := success and RegQueryDWordValue(HKLM, key, 'Release', release);
success := success and (release >= versionRelease);
end;
result := success and (install = 1) and (serviceCount >= service);
end;
function InitializeSetup(): Boolean;
var Path:string;
ResultCode: Integer;
begin
if not IsDotNetDetected('v4.5', 0) then begin
ExtractTemporaryFile('NDP452-KB2901907-x86-x64-AllOS-ENU.exe');
Exec(ExpandConstant('{tmp}\NDP452-KB2901907-x86-x64-AllOS-ENU.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
result := true;
end else
result := true;
end;