Inno Setup安装MySQL Connector后触发Error 193问题求助
问题排查与修复方案
核心问题分析
- 直接运行MSI文件触发的错误:Error 192/193本质是因为直接调用
.msi文件,正确的MSI安装必须通过系统自带的msiexec.exe执行,直接运行MSI易触发系统兼容性或文件关联问题。 - 重复执行安装逻辑:你在
[Run]段和BeforeInstall的InstallMySQLConnectorNet过程中重复调用了MySQL Connector的MSI,用户取消安装后仍会触发[Run]段的调用,引发错误。 - .NET版本判断逻辑错误:
IsDotNetInstalled函数用GetWindowsVersion判断,该函数返回的是Windows系统版本而非.NET Runtime版本,当前逻辑完全错误,只是未暴露问题而已。 - 违背主程序安装需求:
InstallMySQLConnectorNet中只要ShellExec失败就调用Abort,强制终止主程序安装,不符合你“无论组件是否存在,主程序安装都需继续”的要求。 - 冗余无效函数:
IsMySQLConnectorInstalled函数仅判断安装目录下的MSI是否存在,完全无法检测组件是否已安装,属于无效逻辑。
修复后的完整脚本
[Run] ; .NET安装:保留原文件调用,同步修正版本判断逻辑 Filename: "{app}\dotnet-sdk-8.0.203-win-x64.exe"; Flags: skipifdoesntexist waituntilterminated; BeforeInstall: CheckDotNet ; 移除原MySQL Connector的[Run]调用,统一在BeforeInstall过程处理 Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent runascurrentuser [Code] ; 正确检测.NET 8.0.3及以上版本的函数 function IsDotNet803OrHigherInstalled: Boolean; var Version: String; begin Result := False; ; 检测64位系统的.NET注册表项 if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.NETCore.App', 'Version', Version) then begin Result := CompareStr(Version, '8.0.3') >= 0; end else begin ; 检测32位系统的.NET注册表项 if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\dotnet\Setup\InstalledVersions\x86\sharedfx\Microsoft.NETCore.App', 'Version', Version) then begin Result := CompareStr(Version, '8.0.3') >= 0; end; end; end; procedure CheckDotNet; begin if not IsDotNet803OrHigherInstalled() then begin MsgBox('需要安装.NET Runtime 8.0.3或更高版本才能继续,即将启动安装程序。', mbInformation, MB_OK); ; 直接执行安装,不终止主程序流程 ShellExec('', ExpandConstant('{app}\dotnet-sdk-8.0.203-win-x64.exe'), '/quiet /norestart', '', SW_SHOW, ewWaitUntilTerminated, ResultCode); end; end; ; 适配64位系统的MySQL Connector/NET安装检测 function IsMySQLConnectorNetInstalled: Boolean; begin Result := RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\MySQL AB\MySQL Connector/Net') or RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\MySQL AB\MySQL Connector/Net'); end; procedure InstallMySQLConnectorNet; var ResultCode: Integer; begin if not IsMySQLConnectorNetInstalled then begin ; 使用msiexec执行MSI,添加静默参数(如需交互可移除/quiet) if not ShellExec('', 'msiexec.exe', '/i "' + ExpandConstant('{app}\mysql-connector-net-8.3.0.msi') + '" /quiet /norestart', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then begin MsgBox('启动MySQL Connector .NET 8.3.0安装程序失败,主程序将继续安装。', mbWarning, MB_OK); ; 移除Abort,确保主程序安装不中断 end; end else begin MsgBox('MySQL Connector .NET 8.3.0已安装,跳过此步骤。', mbInformation, MB_OK); end; end; function InitializeSetup: Boolean; begin Result := True; end;
关键修复点说明
- MSI调用方式修正:通过
msiexec.exe /i "文件路径"执行MSI安装,彻底解决Error 192/193问题,/quiet参数可实现静默安装,如需交互可移除。 - 移除重复执行逻辑:删除
[Run]段中MySQL Connector的调用,所有安装逻辑统一在BeforeInstall过程处理,避免重复触发错误。 - 修正.NET版本检测:改用注册表查询.NET实际安装版本,替代错误的Windows版本判断逻辑。
- 保留主程序安装流程:移除
Abort调用,即使用户取消Connector安装或安装失败,主程序仍会完成安装,符合需求。 - 适配64位系统:添加
WOW6432Node路径检测,覆盖64位系统下32位组件的注册表项。
内容的提问来源于stack exchange,提问作者Nuno de Freitas
相关产品推荐
相关产品推荐

