You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Inno Setup安装MySQL Connector后触发Error 193问题求助

问题排查与修复方案

核心问题分析

  1. 直接运行MSI文件触发的错误:Error 192/193本质是因为直接调用.msi文件,正确的MSI安装必须通过系统自带的msiexec.exe执行,直接运行MSI易触发系统兼容性或文件关联问题。
  2. 重复执行安装逻辑:你在[Run]段和BeforeInstall的InstallMySQLConnectorNet过程中重复调用了MySQL Connector的MSI,用户取消安装后仍会触发[Run]段的调用,引发错误。
  3. .NET版本判断逻辑错误:IsDotNetInstalled函数用GetWindowsVersion判断,该函数返回的是Windows系统版本而非.NET Runtime版本,当前逻辑完全错误,只是未暴露问题而已。
  4. 违背主程序安装需求:InstallMySQLConnectorNet中只要ShellExec失败就调用Abort,强制终止主程序安装,不符合你“无论组件是否存在,主程序安装都需继续”的要求。
  5. 冗余无效函数: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:17:06