Check .NET Version with Inno Setup

原文  http://www.kynosarges.de/DotNetVersion.html

Inno Setup by Jordan Russell is a great installation scripting program, but lacks a built-in function to determine the .NET Framework version installed on the target machine. Fortunately, it’s easy to write such a function using Inno Setup’s Pascal scripting language.

Microsoft maintains a set of registry keys that indicate the installed .NET Framework versions and service packs. C# MVP Scott Dorman has posted a list comprising versions 1.0 through 4.0 (at the time of this writing) in this Stack Overflow thread. The required registry keys are quite similar for most .NET Framework versions except 1.0. We’ll ignore that version which has been obsoleted by 1.1 anyway.

Version 4.5 is somewhat tricky since it installs as an in-place update for version 4.0 and reuses the exact same registry keys. The MSDN page How to: Determine Which .NET Framework Versions Are Installed suggests checking for the presence of DWORD value Release, so that’s what I’m doing below. An alternative would be to examine the REG_SZ value Version which equals 4.0.30319 for .NET 4.0 and 4.5.50709 for .NET 4.5.

The Script

In the following Inno Setup scripting code block, function IsDotNetDetected checks whether the specified .NET Framework version and at least the specified service pack level are installed. All listed version strings are for final release versions; betas and release candidates typically have different version numbers. Function InitializeSetup demonstrates how to use IsDotNetDetected to check for .NET Framework 4.0 Client Profile without service packs.

I’m placing this small bit of code in the public domain, so you may embed it in your own projects as you see fit.

[Code]

function IsDotNetDetected(version: string; service: cardinal): boolean;

// Indicates whether the specified version and service pack of the .NET Framework is installed.

//

// version -- Specify one of these strings for the required .NET Framework version:

//    'v1.1.4322'     .NET Framework 1.1

//    'v2.0.50727'    .NET Framework 2.0

//    'v3.0'          .NET Framework 3.0

//    'v3.5'          .NET Framework 3.5

//    'v4\Client'     .NET Framework 4.0 Client Profile

//    'v4\Full'       .NET Framework 4.0 Full Installation

//    'v4.5'          .NET Framework 4.5

//

// service -- Specify any non-negative integer for the required service pack level:

//    0               No service packs required

//    1, 2, etc.      Service pack 1, 2, etc. required

var

    key: string;

    install, release, serviceCount: cardinal;

    check45, success: boolean;

begin

    // .NET 4.5 installs as update to .NET 4.0 Full

    if version = 'v4.5' then begin

        version := 'v4\Full';

        check45 := true;

    end else

        check45 := false;



    // installation key group for all .NET versions

    key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version;



    // .NET 3.0 uses value InstallSuccess in subkey Setup

    if Pos('v3.0', version) = 1 then begin

        success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);

    end else begin

        success := RegQueryDWordValue(HKLM, key, 'Install', install);

    end;



    // .NET 4.0/4.5 uses value Servicing instead of SP

    if Pos('v4', version) = 1 then begin

        success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);

    end else begin

        success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);

    end;



    // .NET 4.5 uses additional value Release

    if check45 then begin

        success := success and RegQueryDWordValue(HKLM, key, 'Release', release);

        success := success and (release >= 378389);

    end;



    result := success and (install = 1) and (serviceCount >= service);

end;





function InitializeSetup(): Boolean;

begin

    if not IsDotNetDetected('v4\Client', 0) then begin

        MsgBox('MyApp requires Microsoft .NET Framework 4.0 Client Profile.'#13#13

            'Please use Windows Update to install this version,'#13

            'and then re-run the MyApp setup program.', mbInformation, MB_OK);

        result := false;

    end else

        result := true;

end;

Published in DotNet on 2010-04-19. Last edited on 2012-09-26. See latest weblog entry.

你可能感兴趣的:(Inno Setup)