0

您好我想要集成.NET Framework版本檢查並自動安裝在我的Inno安裝腳本中。InnoSetup:檢查.NET框架 - 安裝不工作

我使用的代碼,我發現這裏:.../installing-net-framework-4-5-automatically-with-inno-setup/`

的問題是,代碼是行不通的。該腳本編譯並輸出正常。
當我嘗試在VM中運行安裝程序時,一切正常。

但是,我沒有看到實際安裝的.NET Framework。
只需一個快速的10秒的進度窗口顯示正在提取的各種文件(如下所示)。
然後它消失,我的設置完成。

當我嘗試啓動我的程序時,它報告未安裝.NET Framework。

enter image description here

下面是完整的代碼:

#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; 

我試圖打破代碼,並試圖找到這個問題。不幸的是,我無法識別它。

任何幫助將不勝感激。謝謝!

+1

那麼,如果手動運行「NetFrameworkInstaller.exe/passive/norestart」,會發生什麼呢?它是否正確安裝.NET框架? –

+0

向我們顯示安裝程序日誌文件('NetFrameworkInstaller.exe/log c:\ path \ to \ log.log')! –

+0

另請注意,您可以[將.NET框架安裝集成到您的安裝程序中](http://stackoverflow.com/q/39247947/850848)。 –

回答

0

好的,終於我確定了這個問題,這是一個令人尷尬的問題。我的虛擬機沒有足夠的空間,但是在安裝腳本程序InstallFramework中未正確報告此錯誤。

即使.NET Framework安裝失敗,條件if not Exec(ExpandConstant('{tmp}\NetFrameworkInstaller.exe'), '/passive /norestart','', SW_SHOW, ewWaitUntilTerminated, ResultCode) then始終會返回False

正確的方法是調用Exec(ExpandConstant('{tmp}\NetFrameworkInstaller.exe'), '/passive /norestart','', SW_SHOW, ewWaitUntilTerminated, ResultCode),然後檢查實際的ResultCode以查看.NET Framework安裝是否成功。在原始腳本中,此ResultCode的值爲5100(沒有足夠的空間)。

因此,我相應地修改和固定了例程。

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;