Inno Setup: Verify that .NET 4.0 is installed

前端 未结 3 1490
野性不改
野性不改 2020-11-29 18:39

I have a component that requires .NET 4.0 to run, how can my Inno Setup installer verify that it is installed, and if not, prompt the user to install it?

3条回答
  •  心在旅途
    2020-11-29 19:05

    The InitializeSetup function is called when the Inno Setup executable is run. Inserting this code for a custom script should do what you want:

    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'          .NET Framework 1.1
    //    'v2.0'          .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
    //    'v4.5.1'        .NET Framework 4.5.1
    //    'v4.5.2'        .NET Framework 4.5.2
    //    'v4.6'          .NET Framework 4.6
    //    'v4.6.1'        .NET Framework 4.6.1
    //    'v4.6.2'        .NET Framework 4.6.2
    //    'v4.7'          .NET Framework 4.7
    //
    // 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, versionKey: string;
        install, release, serviceCount, versionRelease: cardinal;
        success: boolean;
    begin
        versionKey := version;
        versionRelease := 0;
    
        // .NET 1.1 and 2.0 embed release number in version key
        if version = 'v1.1' then begin
            versionKey := 'v1.1.4322';
        end else if version = 'v2.0' then begin
            versionKey := 'v2.0.50727';
        end
    
        // .NET 4.5 and newer install as update to .NET 4.0 Full
        else if Pos('v4.', version) = 1 then begin
            versionKey := 'v4\Full';
            case version of
              'v4.5':   versionRelease := 378389;
              'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older
              'v4.5.2': versionRelease := 379893;
              'v4.6':   versionRelease := 393295; // 393297 on Windows 8.1 and older
              'v4.6.1': versionRelease := 394254; // 394271 before Win10 November Update
              'v4.6.2': versionRelease := 394802; // 394806 before Win10 Anniversary Update
              'v4.7':   versionRelease := 460798; // 460805 before Win10 Creators Update
            end;
        end;
    
        // installation key group for all .NET versions
        key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey;
    
        // .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 and newer use 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 and newer use additional value Release
        if versionRelease > 0 then begin
            success := success and RegQueryDWordValue(HKLM, key, 'Release', release);
            success := success and (release >= versionRelease);
        end;
    
        result := success and (install = 1) and (serviceCount >= service);
    end;
    
    
    function InitializeSetup(): Boolean;
    begin
        if not IsDotNetDetected('v4.6', 0) then begin
            MsgBox('MyApp requires Microsoft .NET Framework 4.6.'#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;
    

    (Code taken from here: http://www.kynosarges.de/DotNetVersion.html)

    First, it checks for the presence of a registry entry that indicates the version of the .NET framework that is installed. If the registry entry is not present, it prompts the user to download the .NET framework. If the user says Yes, it opens the download URL. (You may have to change the version it specifies in the script to version 4.0.)


    I also came across this article on CodeProject, which may be a more comprehensive and customizable way of doing what you're looking for, although it may take more work to understand and will have to be modified to work with version 4.0.

提交回复
热议问题