InnoSetup:检查 .NET Framework - 安装不工作

InnoSetup: Check .NET Framework - installation not working

您好,我正在尝试在我的 Inno Setup 脚本中集成 .NET Framework 版本检查和自动安装。

我正在使用在这里找到的代码:.../installing-net-framework-4-5-automatically-with-inno-setup/`

问题是,代码无法正常工作。脚本编译并输出正常。
当我尝试 运行 在 VM 中进行设置时,一切正常。

但是,我没有看到实际安装的 .NET Framework。
只需 10 秒的快速进度 window 即可显示正在提取的各种文件(如下所示)。
然后它消失了,我的设置完成了。

当我尝试启动我的程序时,它报告未安装 .NET Framework。

完整代码如下:

#include <idp.iss>
function Framework45IsNotInstalled(): Boolean;
    var
        bSuccess: Boolean;
        regVersion: Cardinal;
    begin
        Result := True;

        bSuccess := RegQueryDWordValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4\Full', 'Release', regVersion);
        if (True = bSuccess) and (regVersion >= 378389) then begin
        Result := False;
    end;
end;

procedure InitializeWizard;
    begin
        if Framework45IsNotInstalled() then
        begin
            idpAddFile('http://go.microsoft.com/fwlink/?LinkId=397707', ExpandConstant('{tmp}\NetFrameworkInstaller.exe'));
            idpDownloadAfter(wpReady);
        end;
    end;

procedure InstallFramework;
    var
        StatusText: string;
        ResultCode: Integer;
    begin
        StatusText := WizardForm.StatusLabel.Caption;
        WizardForm.StatusLabel.Caption := 'Installing .NET Framework 4.5.2. This might take a few minutes…';
        WizardForm.ProgressGauge.Style := npbstMarquee;
    try
        if not Exec(ExpandConstant('{tmp}\NetFrameworkInstaller.exe'), '/passive /norestart','', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
        begin
            MsgBox('.NET installation failed with code: ' + IntToStr(ResultCode) + '.', mbError, MB_OK);
        end;
    finally
        WizardForm.StatusLabel.Caption := StatusText;
        WizardForm.ProgressGauge.Style := npbstNormal;

        DeleteFile(ExpandConstant('{tmp}\NetFrameworkInstaller.exe'));
    end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
    begin
        case CurStep of
            ssPostInstall:
            begin
                if Framework45IsNotInstalled() then
                begin
                    InstallFramework();
                end;
            end;
        end;
    end;

我尝试分解代码并试图找出问题所在。不幸的是,我无法识别它。

如有任何帮助,我们将不胜感激。谢谢!

好吧,我终于确定了问题所在,这是一个令人尴尬的问题。我的 VM 没有足够的 space,但安装脚本过程中没有正确报告此错误 InstallFramework

条件 if not Exec(ExpandConstant('{tmp}\NetFrameworkInstaller.exe'), '/passive /norestart','', SW_SHOW, ewWaitUntilTerminated, ResultCode) then 总是 returns False,即使 .NET Framework 安装失败。

正确的方法是只调用 Exec(ExpandConstant('{tmp}\NetFrameworkInstaller.exe'), '/passive /norestart','', SW_SHOW, ewWaitUntilTerminated, ResultCode) 然后检查实际的 ResultCode 以查看 .NET Framework 安装是否成功。在原始脚本中,此 ResultCode 的值为 5100(space 不够)。

所以,我相应地修改并修复了例程。

procedure InstallFramework;
var
    StatusText: string;
    ResultCode: Integer;
begin
   StatusText := WizardForm.StatusLabel.Caption;
   WizardForm.StatusLabel.Caption := 'Installing .NET Framework 4.5.2. This might take a few minutes...';
   WizardForm.ProgressGauge.Style := npbstMarquee;

   try
       Exec(ExpandConstant('{tmp}\NetFrameworkInstaller.exe'), '/passive /norestart', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
       if ResultCode <> 0 then
       begin
           MsgBox('.NET installation failed with code: ' + IntToStr(ResultCode) + '.' + #13#10 + #13#10 + 'Setup will now terminate.', mbError, MB_OK);
           DeleteFile(ExpandConstant('{tmp}\NetFrameworkInstaller.exe'));
           Exterminate;
       end
       else 
       begin
           WizardForm.StatusLabel.Caption := StatusText;
           WizardForm.ProgressGauge.Style := npbstNormal;
       end;
   finally
           DeleteFile(ExpandConstant('{tmp}\NetFrameworkInstaller.exe'));
   end;
end;

如果 .NET Framework 安装失败,Exterminate 程序会中止安装(没有提示)。

var
   ForceClose: Boolean;

procedure Exterminate;
begin
    ForceClose:= True;
    WizardForm.Close;  
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
    Confirm:= not ForceClose;
end;