Freigeben über


Installing .NET Framework 4.5 automatically with Inno Setup

In this guide I will walk through how to get the .NET framework to download and install on-the-fly in an Inno Setup installer.

It works in 3 steps:

  1. Detect if the desired .NET framework is installed
  2. Download the .NET Framework bootstrap installer with Inno Download Plugin
  3. Run the bootstrap installer in quiet mode, which will download and install the .NET Framework. This is better than downloading the full installer since it only downloads the files it needs for your platform.

Detecting if the desired .NET Framework is installed

First you need to determine what registry key to check to see if your .NET version is installed. There is a good Stack Overflow answer that covers this, though the MSDN page is more likely to be up to date. There is also a good article on how to apply that in Inno Setup's Pascal scripting language.

I wrote mine to check for .NET 4.5. I use this helper function, in the [Code] section of the .iss file:

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;

Downloading the bootstrapper

Next we need to find out where to download the installer from. The .NET Framework Deployment Guide for Developers has a great list of stable download links for the bootstrapper (web) installers. I picked 4.5.2, as it still supports code targeting .NET 4.5, and we might as well give the users the latest we can. This link should prompt you to download an .exe file directly; if it's bringing you to a download webpage, it won't work.

Now install Inno Download Plugin and put this at the top of your .iss file:

#include <idp.iss>

Put this in the [Code] section:

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

This "InitializeWizard" method is a special one that InnoSetup calls when first setting up its wizard pages. We call our helper function to detect if the framework is installed, then schedule a download step after the "Ready to install" page. We include our direct download link determined earlier, and save it in a temp folder, with a file name of "NetFrameworkInstaller.exe". This name I picked arbitrarily; we just need to refer to it later when we're installing and cleaning up.

Installing the bootstrapper

 

We'll make another helper method to do the actual install. We specify another specially named method to hook our code up after the post-install event:

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;

We're running the bootstrapper we downloaded earlier, with a flag to make the install passive (non interactive). Our main installer will show this screen while the framework is getting downloaded and installed:

 

Then the .NET installer UI will show alongside the first window:

If you'd like to keep it "cleaner" and just show the first screen you can swap out the /passive argument for /q. However I like showing the user the .NET install progress since it can take a long time and it reassures them that work is still really happening.

After running the installer, the bootstrapper is deleted (whether or not the install succeeded).

And now your installer is done!

Testing the installer

 

To test a .NET 4 or 4.5 install, I'd recommend setting up a Windows 7 virtual machine in Hyper-V. Windows 7 comes with .NET 2, 3 and 3.5 out of the box, but not .NET 4 or 4.5. After it installs the framework you can go to Programs and Features to cleanly remove it and test it all over again.

To test an earlier .NET version you should just be able to use a modern OS like Windows 8.1 or 10.

Comments

  • Anonymous
    July 21, 2015
    Great article. ITD is just old today. It should be replaced by : IDP : code.google.com/.../inno-download-plugin just a few changes : #include <idp.iss> [Code] procedure InitializeWizard(); begin  if Framework45IsNotInstalled() then  begin    idpAddFile('go.microsoft.com/fwlink, ExpandConstant('{tmp}NetFrameworkInstaller.exe'));    idpDownloadAfter(wpReady);  end; end;

  • Anonymous
    July 23, 2015
    Thanks for the tip, Vincent! I've updated the guide to point to IDP instead. It's quite nice to remove that ugly step of hacking InnoTools Downloader.

  • Anonymous
    November 11, 2015
    Hi there, The steps to follow is what I was exactly looking for. But, in my case, it is .Net 3.5 SP1 (VB 2008 Pro). So, I would be very happy and appreciate it very much if the author of this post could help me what I should modify so that I can use it to my application installation using Inno Setup. Thank you in advance,

  • Anonymous
    December 03, 2015
    I am getting Error Line73:Column11: Unknown Identifier 'InstallFramework'

  • Anonymous
    December 07, 2015
    For me too

  • Anonymous
    June 27, 2016
    Helped a lot Thank you!!!

  • Anonymous
    October 05, 2016
    The comment has been removed

  • Anonymous
    October 21, 2016
    My install hangs on the dot install stating Waiting for another install to complete...

    • Anonymous
      October 21, 2016
      Never mind it just took a while. It's working.
  • Anonymous
    October 21, 2016
    I have another question. What is you have two dependencies. So want to include Dot Net and MySQL Connector Net. When I duplicate your code for the MySQL install I get a compile error "Duplicate identifier 'CURSTEPCHANGED'. If I compile seperatly they both work. How can I do this...

    • Anonymous
      October 21, 2016
      Sorry I figured it out. Had to combine the two instances.
  • Anonymous
    February 27, 2017
    got an error '2' when .NET tried to install - have you seen this? thanks.

  • Anonymous
    December 14, 2017
    Hi DavidThanks for the post, it's been really helpful.Unfortunately my .Net install fails as soon as it starts, with a 216 error code. I'm unable to find any reference to this code anywhere.Any help appreciated