InnoSetup撰寫偵測net8Runtime是否安裝/下載與安裝的安裝程序(InnoSetupUnicode_net8Runtime)
InnoSetup撰寫偵測net8Runtime是否安裝/下載與安裝的安裝程序(InnoSetupUnicode_net8Runtime)
資料來源: copilot
GITHUB: https://github.com/jash-git/InnoSetup_net8Runtime_script
AI 問題:
Inno Setup Script 實作偵測系統是否安裝.net8 WindowsDesktop Runtime 8.0.12 以下是REGEDIT 當有安裝確切的紀錄路徑 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.WindowsDesktop.App 將wget.exe 打包進安裝檔中 一起發布 如果沒有安裝 就立刻使用在安裝目錄下的curl.exe直接下載 https://download.visualstudio.microsoft.com/download/pr/f1e7ffc8-c278-4339-b460-517420724524/f36bb75b2e86a52338c4d3a90f8dac9b/windowsdesktop-runtime-8.0.12-win-x64.exe 並且執行安裝 的 完整可以編譯範例
code:00_ne8_Runtime_檢查NET8_OK.iss
; 定義一些常量 #define RuntimeVersion "8.0.12" #define RuntimeURL "https://download.visualstudio.microsoft.com/download/pr/f1e7ffc8-c278-4339-b460-517420724524/f36bb75b2e86a52338c4d3a90f8dac9b/windowsdesktop-runtime-8.0.12-win-x64.exe" [Setup] AppName=YourAppName AppVersion=1.0 DefaultDirName={pf}\YourAppName DefaultGroupName=YourAppName OutputBaseFilename=setup Compression=lzma SolidCompression=yes [Files] ; 將 wget.exe 打包進安裝檔中 Source: "wget.exe"; DestDir: "{tmp}"; Flags: ignoreversion [Code] const RuntimeKeyBase1 = 'SOFTWARE\WOW6432Node\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.WindowsDesktop.App'; RuntimeKeyBase2 = 'SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.WindowsDesktop.App'; RuntimeVersionKey = '{#RuntimeVersion}'; function IsRuntimeInstalled: Boolean; var InstallKey1, InstallKey2: String; InstallLocation, Version, DebugMsg: String; begin Result := False; InstallKey1 := RuntimeKeyBase1 + '\' + RuntimeVersionKey; InstallKey2 := RuntimeKeyBase2 + '\' + RuntimeVersionKey; MsgBox('正在檢查註冊表鍵:' + InstallKey1, mbInformation, MB_OK); if RegQueryStringValue(HKLM, InstallKey1, 'InstallLocation', InstallLocation) then begin DebugMsg := '找到安裝位置:' + InstallLocation; if InstallLocation <> '' then begin Result := True; end else begin DebugMsg := DebugMsg + ' (InstallLocation 為空)'; end; end else if RegQueryStringValue(HKLM, InstallKey1, 'Version', Version) then begin DebugMsg := '找到版本:' + Version; if Version <> '' then begin Result := True; end else begin DebugMsg := DebugMsg + ' (Version 為空)'; end; end else begin DebugMsg := '未找到 InstallLocation 或 Version 值在 ' + InstallKey1 + '。'; end; if not Result then begin MsgBox('正在檢查註冊表鍵:' + InstallKey2, mbInformation, MB_OK); if RegQueryStringValue(HKLM, InstallKey2, 'InstallLocation', InstallLocation) then begin DebugMsg := '找到安裝位置:' + InstallLocation; if InstallLocation <> '' then begin Result := True; end else begin DebugMsg := DebugMsg + ' (InstallLocation 為空)'; end; end else if RegQueryStringValue(HKLM, InstallKey2, 'Version', Version) then begin DebugMsg := '找到版本:' + Version; if Version <> '' then begin Result := True; MsgBox('.NET 8 WindowsDesktop Runtime 已安裝,版本:' + Version, mbInformation, MB_OK); end else begin DebugMsg := DebugMsg + ' (Version 為空)'; end; end else begin DebugMsg := DebugMsg + ' 未找到 InstallLocation 或 Version 值在 ' + InstallKey2 + '。'; end; end; MsgBox(DebugMsg, mbInformation, MB_OK); if Result then begin MsgBox('.NET 8 WindowsDesktop Runtime 已安裝。', mbInformation, MB_OK); end else begin MsgBox('.NET 8 WindowsDesktop Runtime 未安裝。', mbInformation, MB_OK); end; end; procedure DownloadAndInstallRuntime(); var ResultCode: Integer; URL, OutputFile, TempPath: String; begin MsgBox('即將開始下載 .NET 8 WindowsDesktop Runtime。', mbInformation, MB_OK); URL := '{#RuntimeURL}'; TempPath := ExpandConstant('{tmp}'); OutputFile := TempPath + '\windowsdesktop-runtime-{#RuntimeVersion}-win-x64.exe'; if not FileExists(OutputFile) then begin Exec(ExpandConstant('{tmp}\wget.exe'), URL + ' -O ' + OutputFile, '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); end; if FileExists(OutputFile) then begin Exec(OutputFile, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); end; end; function InitializeSetup(): Boolean; begin Result := True; if IsRuntimeInstalled() then begin MsgBox('已偵測到 .NET 8 WindowsDesktop Runtime 已安裝。', mbInformation, MB_OK); end else begin DownloadAndInstallRuntime(); end; end;
code:01_ne8_Runtime_內建CURL下載與安裝_OK.iss
; 定義一些常量 #define RuntimeVersion "8.0.12" #define RuntimeURL "https://download.visualstudio.microsoft.com/download/pr/f1e7ffc8-c278-4339-b460-517420724524/f36bb75b2e86a52338c4d3a90f8dac9b/windowsdesktop-runtime-8.0.12-win-x64.exe" [Setup] AppName=YourAppName AppVersion=1.0 DefaultDirName={pf}\YourAppName DefaultGroupName=YourAppName OutputBaseFilename=setup Compression=lzma SolidCompression=yes [Files] ; 將 wget.exe 打包進安裝檔中 Source: "wget.exe"; DestDir: "{tmp}"; Flags: ignoreversion [Code] const RuntimeKey = 'SOFTWARE\WOW6432Node\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.WindowsDesktop.App'; RuntimeVersionKey = '{#RuntimeVersion}'; function IsRuntimeInstalled: Boolean; var InstallKey: String; Value: Cardinal; DebugMsg: String; begin Result := False; InstallKey := RuntimeKey + '\' + RuntimeVersionKey; MsgBox('正在檢查註冊表鍵:' + InstallKey, mbInformation, MB_OK); if RegQueryDWordValue(HKLM, RuntimeKey, RuntimeVersionKey, Value) then begin DebugMsg := '找到 DWORD 值:' + IntToStr(Value); if Value = 1 then begin Result := True; DebugMsg := DebugMsg + ' (值匹配)'; end else begin DebugMsg := DebugMsg + ' (值不匹配)'; end; end else begin DebugMsg := '未找到 DWORD 值。'; end; MsgBox(DebugMsg, mbInformation, MB_OK); if Result then begin MsgBox('.NET 8 WindowsDesktop Runtime 已安裝。', mbInformation, MB_OK); end else begin MsgBox('.NET 8 WindowsDesktop Runtime 未安裝。', mbInformation, MB_OK); end; end; procedure DownloadAndInstallRuntime(); var ResultCode: Integer; URL, OutputFile, TempPath: String; DownloadSuccess: Boolean; begin MsgBox('即將開始下載 .NET 8 WindowsDesktop Runtime。', mbInformation, MB_OK); URL := '{#RuntimeURL}'; TempPath := ExpandConstant('{tmp}'); OutputFile := TempPath + '\windowsdesktop-runtime-{#RuntimeVersion}-win-x64.exe'; DownloadSuccess := False; if not FileExists(OutputFile) then begin Exec(ExpandConstant('{tmp}\wget.exe'), '--no-check-certificate ' + URL + ' -O ' + OutputFile, '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); if ResultCode = 0 then begin DownloadSuccess := True; MsgBox('.NET 8 WindowsDesktop Runtime 下載成功。', mbInformation, MB_OK); end else begin MsgBox('.NET 8 WindowsDesktop Runtime 下載失敗。錯誤碼:' + IntToStr(ResultCode), mbError, MB_OK); end; end else begin DownloadSuccess := True; MsgBox('.NET 8 WindowsDesktop Runtime 文件已存在,無需下載。', mbInformation, MB_OK); end; if DownloadSuccess then begin Exec(OutputFile, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); if ResultCode = 0 then begin MsgBox('.NET 8 WindowsDesktop Runtime 安裝成功。', mbInformation, MB_OK); end else begin MsgBox('.NET 8 WindowsDesktop Runtime 安裝失敗。錯誤碼:' + IntToStr(ResultCode), mbError, MB_OK); end; end; end; function InitializeSetup(): Boolean; begin Result := True; if IsRuntimeInstalled() then begin MsgBox('已偵測到 .NET 8 WindowsDesktop Runtime 已安裝。', mbInformation, MB_OK); end else begin DownloadAndInstallRuntime(); end; end;
code:02_ne8_Runtime_外掛CURL下載與安裝_OK.iss
; 定義一些常量 #define RuntimeVersion "8.0.12" #define RuntimeURL "https://download.visualstudio.microsoft.com/download/pr/f1e7ffc8-c278-4339-b460-517420724524/f36bb75b2e86a52338c4d3a90f8dac9b/windowsdesktop-runtime-8.0.12-win-x64.exe" [Setup] AppName=YourAppName AppVersion=1.0 DefaultDirName={pf}\YourAppName DefaultGroupName=YourAppName OutputBaseFilename=setup Compression=lzma SolidCompression=yes [Files] ; 將 curl.exe 和 curl-ca-bundle.crt 打包進安裝檔中 Source: "curl.exe"; DestDir: "{tmp}"; Flags: ignoreversion Source: "curl-ca-bundle.crt"; DestDir: "{tmp}"; Flags: ignoreversion [Code] const RuntimeKey = 'SOFTWARE\WOW6432Node\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.WindowsDesktop.App'; RuntimeVersionKey = '{#RuntimeVersion}'; function IsRuntimeInstalled: Boolean; var InstallKey: String; Value: Cardinal; DebugMsg: String; begin Result := False; InstallKey := RuntimeKey + '\' + RuntimeVersionKey; MsgBox('正在檢查註冊表鍵:' + InstallKey, mbInformation, MB_OK); if RegQueryDWordValue(HKLM, RuntimeKey, RuntimeVersionKey, Value) then begin DebugMsg := '找到 DWORD 值:' + IntToStr(Value); if Value = 1 then begin Result := True; DebugMsg := DebugMsg + ' (值匹配)'; end else begin DebugMsg := DebugMsg + ' (值不匹配)'; end; end else begin DebugMsg := '未找到 DWORD 值。'; end; MsgBox(DebugMsg, mbInformation, MB_OK); if Result then begin MsgBox('.NET 8 WindowsDesktop Runtime 已安裝。', mbInformation, MB_OK); end else begin MsgBox('.NET 8 WindowsDesktop Runtime 未安裝。', mbInformation, MB_OK); end; end; function CopyCurlFilesToTemp(): Boolean; begin Result := False; if FileExists(ExpandConstant('{tmp}\curl.exe')) and FileExists(ExpandConstant('{tmp}\curl-ca-bundle.crt')) then begin MsgBox('curl.exe 和 curl-ca-bundle.crt 已成功複製到 {tmp} 資料夾。', mbInformation, MB_OK); Result := True; end else begin MsgBox('curl.exe 或 curl-ca-bundle.crt 未成功複製到 {tmp} 資料夾。', mbError, MB_OK); end; end; procedure ExtractCurlFiles(); begin ExtractTemporaryFile('curl.exe'); ExtractTemporaryFile('curl-ca-bundle.crt'); end; procedure DownloadAndInstallRuntime(); var ResultCode: Integer; URL, TempPath: String; DownloadSuccess: Boolean; begin MsgBox('即將開始下載 .NET 8 WindowsDesktop Runtime。', mbInformation, MB_OK); URL := '{#RuntimeURL}'; TempPath := ExpandConstant('{tmp}'); DownloadSuccess := False; if CopyCurlFilesToTemp() then begin Exec(TempPath + '\curl.exe', '-L -O ' + URL + ' --cacert ' + TempPath + '\curl-ca-bundle.crt', TempPath, SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); if ResultCode = 0 then begin DownloadSuccess := True; MsgBox('.NET 8 WindowsDesktop Runtime 下載成功。', mbInformation, MB_OK); end else begin MsgBox('.NET 8 WindowsDesktop Runtime 下載失敗。錯誤碼:' + IntToStr(ResultCode), mbError, MB_OK); end; end else begin Exit; // 終止安裝過程 end; if DownloadSuccess then begin Exec(TempPath + '\windowsdesktop-runtime-{#RuntimeVersion}-win-x64.exe', '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); if ResultCode = 0 then begin MsgBox('.NET 8 WindowsDesktop Runtime 安裝成功。', mbInformation, MB_OK); end else begin MsgBox('.NET 8 WindowsDesktop Runtime 安裝失敗。錯誤碼:' + IntToStr(ResultCode), mbError, MB_OK); end; end; end; function InitializeSetup(): Boolean; begin Result := True; ExtractCurlFiles(); if not CopyCurlFilesToTemp() then begin MsgBox('無法複製 curl 文件到 {tmp} 資料夾。', mbError, MB_OK); Result := False; Exit; end; if IsRuntimeInstalled() then begin MsgBox('已偵測到 .NET 8 WindowsDesktop Runtime 已安裝。', mbInformation, MB_OK); end else begin DownloadAndInstallRuntime(); end; end;