title: Inno Setup: Install .NET framework, reboot the system and continue installation
body: <p>I need to install some system prerequisites and after finalizing them restart the system, then it must continue the installation where I left off. The prerequisites are .NET framework and an update of Windows.</p>
  
  <p>My <code>[Code]</code> section:</p>
  
  <pre class="lang-pascal prettyprint-override"><code>const
    (*** Customize the following to your own name. ***)
    RunOnceName = 'My Program Setup restart';
  
    QuitMessageReboot = 'Os requisitos para a instalação do sistema não estão completos. Precisamos reiniciar seu computador para continuar a instalação do sistema.'#13#13'Depois de reiniciar o seu computador, o setup irá continuar a instalação após o primeiro login com uma conta administradora.';
    QuitMessageError = 'Error. Cannot continue.';
  
  var
    Restarted: Boolean;
    ResultCode: Integer;
  
  function InitializeSetup(): Boolean;
  begin
    Restarted := ExpandConstant('{param:restart|0}') = '1';
  
    if not Restarted then begin
      Result := not RegValueExists(HKLM, 'Software\Microsoft\Windows\CurrentVersion\RunOnce', RunOnceName);
      if not Result then
        MsgBox(QuitMessageReboot, mbError, mb_Ok);
    end else
      Result := True;
  end;
  
  function DetectAndInstallPrerequisites: Boolean;
  begin
    (*** Place your prerequisite detection and installation code below. ***)
    (*** Return False if missing prerequisites were detected but their installation failed, else return True. ***)
  
    if not Exec(ExpandConstant('{tmp}\dotNetFx40_Full_x86_x64.exe'), '/q /norestart', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
    begin
      MsgBox(QuitMessageReboot + IntToStr(ResultCode) + '....',
        mbError, MB_OK);    
    end;
  
    Result := True;
  end;
  
  function Quote(const S: String): String;
  begin
    Result := '"' + S + '"';
  end;
  
  function AddParam(const S, P, V: String): String;
  begin
    if V &lt;&gt; '""' then
      Result := S + ' /' + P + '=' + V;
  end;
  
  function AddSimpleParam(const S, P: String): String;
  begin
   Result := S + ' /' + P;
  end;
  
  procedure CreateRunOnceEntry;
  var
    RunOnceData: String;
  begin
    RunOnceData := Quote(ExpandConstant('{srcexe}')) + ' /restart=1';
    RunOnceData := AddParam(RunOnceData, 'LANG', ExpandConstant('{language}'));
    RunOnceData := AddParam(RunOnceData, 'DIR', Quote(WizardDirValue));
    RunOnceData := AddParam(RunOnceData, 'GROUP', Quote(WizardGroupValue));
    if WizardNoIcons then
      RunOnceData := AddSimpleParam(RunOnceData, 'NOICONS');
    RunOnceData := AddParam(RunOnceData, 'TYPE', Quote(WizardSetupType(False)));
    RunOnceData := AddParam(RunOnceData, 'COMPONENTS', Quote(WizardSelectedComponents(False)));
    RunOnceData := AddParam(RunOnceData, 'TASKS', Quote(WizardSelectedTasks(False)));
  
    (*** Place any custom user selection you want to remember below. ***)
  
    //&lt;your code here&gt;
  
    RegWriteStringValue(HKLM, 'Software\Microsoft\Windows\CurrentVersion\RunOnce', RunOnceName, RunOnceData);
  end;
  
  function PrepareToInstall(var NeedsRestart: Boolean): String;
  var
    ChecksumBefore, ChecksumAfter: String;
  begin
    ChecksumBefore := MakePendingFileRenameOperationsChecksum;
    if DetectAndInstallPrerequisites then begin
      ChecksumAfter := MakePendingFileRenameOperationsChecksum;
      if ChecksumBefore &lt;&gt; ChecksumAfter then begin
        CreateRunOnceEntry;
        NeedsRestart := True;
        Result := QuitMessageReboot;
      end;
    end else
      Result := QuitMessageError;
  end;
  
  function ShouldSkipPage(PageID: Integer): Boolean;
  begin
    Result := Restarted;
  end;
  </code></pre>
  
  <p>The return is the variable <code>QuitMessageReboot</code> concatenated with the <code>ResultCode</code> that has the value <code>2</code>.</p>
  
  <p>The <code>dotNetFx40_Full_x86_x64.exe</code> is installed by:</p>
  
  <pre><code>[Files]
  ;.Net Framework
  Source: "Dependencias\.Net Framework\dotNetFx40_Full_x86_x64.exe"; DestDir: "{tmp}"; \
      Flags: deleteafterinstall
  </code></pre>