Check for .NET4.5+ with NSIS

前端 未结 6 1865
暗喜
暗喜 2020-12-28 20:22

All, I am aware of the following methods to check the framework version in NSIS. For .NET4.0+ I currently use

Function IsDotNetInstalled

    StrCpy $0 \"0\         


        
相关标签:
6条回答
  • 2020-12-28 20:55

    Here's a simple NSIS Function that checks for .NET versions (works for 4.5, 4.5.1, 4.5.2 and 4.6). The numeric comparisons are based on MSDN.

    Place the function in your NSIS file and invoke it like so

    Call CheckForDotVersion45Up
    Pop $0
    DetailPrint $0
    

    Here is the function.

    ; returns a numeric value on the stack, ranging from 0 to 450, 451, 452 or 460. 0 means nothing found, the other values mean at least that version
    Function CheckForDotVersion45Up
    
      ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Release
    
      IntCmp $0 393295 is46 isbelow46 is46
    
      isbelow46:
      IntCmp $0 379893 is452 isbelow452 is452
    
      isbelow452:
      IntCmp $0 378675 is451 isbelow451 is451
    
      isbelow451:
      IntCmp $0 378389 is45 isbelow45 is45
    
      isbelow45:
      Push 0
      Return
    
      is46:
      Push 460
      Return
    
      is452:
      Push 452
      Return
    
      is451:
      Push 451
      Return
    
      is45:
      Push 45
      Return
    
    FunctionEnd
    
    0 讨论(0)
  • 2020-12-28 21:01

    In the end I went with the following function which utilises the answer above. This method first creates a directory "$INSTDIR\dotNETFramework" which contains the .NET web installer:

    Function CheckAndInstallDotNet
        ; Installer dotNetFx45_Full_setup.exe avalible from http://msdn.microsoft.com/en-us/library/5a4x27ek.aspx
        ; Magic numbers from http://msdn.microsoft.com/en-us/library/ee942965.aspx
        ClearErrors
        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Release"
        IfErrors NotDetected
        ${If} $0 >= 378389
            DetailPrint "Microsoft .NET Framework 4.5 is installed ($0)"
        ${Else}
        NotDetected:
            MessageBox MB_YESNO|MB_ICONQUESTION ".NET Framework 4.5+ is required for ProgramX2013, \
                do you want to launch the web installer? This requires a valid internet connection." IDYES InstallDotNet IDNO Cancel 
            Cancel:
                MessageBox MB_ICONEXCLAMATION "To install ProgramX, Microsoft's .NET Framework v${DOT_MAJOR}.${DOT_MINOR} \
                    (or higher) must be installed. Cannot proceed with the installation!"
                ${OpenURL} "${WWW_MS_DOTNET4_5}"
                RMDir /r "$INSTDIR" 
                SetOutPath "$PROGRAMFILES"
                RMDir "$INSTDIR" 
                Abort
    
            ; Install .NET4.5.
            InstallDotNet:
                DetailPrint "Installing Microsoft .NET Framework 4.5"
                SetDetailsPrint listonly
                ExecWait '"$INSTDIR\dotNETFramework\dotNetFx45_Full_setup.exe" /passive /norestart' $0
                ${If} $0 == 3010 
                ${OrIf} $0 == 1641
                    DetailPrint "Microsoft .NET Framework 4.5 installer requested reboot."
                    SetRebootFlag true 
                ${EndIf}
                SetDetailsPrint lastused
                DetailPrint "Microsoft .NET Framework 4.5 installer returned $0"
        ${EndIf}
    
        ; Now remove the dotNETFramework directory and contents.
        RMDir /r "$INSTDIR\dotNETFramework" 
    FunctionEnd
    

    This method seemlessley launches the .NET4.5 installer if there is an internet connection and returns after the installation is complete.

    I hope this helps someone else.

    0 讨论(0)
  • 2020-12-28 21:02

    Here is a function that I wrote that checks for, and downloads if needed, .NET 4.5. In addition, the code also looks for a local copy of the .NET installer - in case you were to put your installer onto a CD or USB drive or something. Supports Silent and Non-Silent installs, as well as setting the Reboot flag. The function is self-contained, but expects you to include LogicLib (which is included with the basic NSIS install).

    This is the code that I wrote for what will be the installer for my Rachel's Story books.

    Function CheckAndDownloadDotNet45
    # Let's see if the user has the .NET Framework 4.5 installed on their system or not
    # Remember: you need Vista SP2 or 7 SP1.  It is built in to Windows 8, and not needed
    # In case you're wondering, running this code on Windows 8 will correctly return is_equal
    # or is_greater (maybe Microsoft releases .NET 4.5 SP1 for example)
    
    # Set up our Variables
    Var /GLOBAL dotNET45IsThere
    Var /GLOBAL dotNET_CMD_LINE
    Var /GLOBAL EXIT_CODE
    
    ReadRegDWORD $dotNET45IsThere HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Release"
    IntCmp $dotNET45IsThere 378389 is_equal is_less is_greater
    
    is_equal:
        Goto done_compare_not_needed
    is_greater:
        # Useful if, for example, Microsoft releases .NET 4.5 SP1
        # We want to be able to simply skip install since it's not
        # needed on this system
        Goto done_compare_not_needed
    is_less:
        Goto done_compare_needed
    
    done_compare_needed:
        #.NET Framework 4.5 install is *NEEDED*
    
        # Microsoft Download Center EXE:
        # Web Bootstrapper: http://go.microsoft.com/fwlink/?LinkId=225704
        # Full Download: http://go.microsoft.com/fwlink/?LinkId=225702
    
        # Setup looks for components\dotNET45Full.exe relative to the install EXE location
        # This allows the installer to be placed on a USB stick (for computers without internet connections)
        # If the .NET Framework 4.5 installer is *NOT* found, Setup will connect to Microsoft's website
        # and download it for you
    
        # Reboot Required with these Exit Codes:
        # 1641 or 3010
    
        # Command Line Switches:
        # /showrmui /passive /norestart
    
        # Silent Command Line Switches:
        # /q /norestart
    
    
        # Let's see if the user is doing a Silent install or not
        IfSilent is_quiet is_not_quiet
    
        is_quiet:
            StrCpy $dotNET_CMD_LINE "/q /norestart"
            Goto LookForLocalFile
        is_not_quiet:
            StrCpy $dotNET_CMD_LINE "/showrmui /passive /norestart"
            Goto LookForLocalFile
    
        LookForLocalFile:
            # Let's see if the user stored the Full Installer
            IfFileExists "$EXEPATH\components\dotNET45Full.exe" do_local_install do_network_install
    
            do_local_install:
                # .NET Framework found on the local disk.  Use this copy
    
                ExecWait '"$EXEPATH\components\dotNET45Full.exe" $dotNET_CMD_LINE' $EXIT_CODE
                Goto is_reboot_requested
    
            # Now, let's Download the .NET
            do_network_install:
    
                Var /GLOBAL dotNetDidDownload
                NSISdl::download "http://go.microsoft.com/fwlink/?LinkId=225704" "$TEMP\dotNET45Web.exe" $dotNetDidDownload
    
                StrCmp $dotNetDidDownload success fail
                success:
                    ExecWait '"$TEMP\dotNET45Web.exe" $dotNET_CMD_LINE' $EXIT_CODE
                    Goto is_reboot_requested
    
                fail:
                    MessageBox MB_OK|MB_ICONEXCLAMATION "Unable to download .NET Framework.  ${PRODUCT_NAME} will be installed, but will not function without the Framework!"
                    Goto done_dotNET_function
    
                # $EXIT_CODE contains the return codes.  1641 and 3010 means a Reboot has been requested
                is_reboot_requested:
                    ${If} $EXIT_CODE = 1641
                    ${OrIf} $EXIT_CODE = 3010
                        SetRebootFlag true
                    ${EndIf}
    
    done_compare_not_needed:
        # Done dotNET Install
        Goto done_dotNET_function
    
    #exit the function
    done_dotNET_function:
    
    FunctionEnd
    
    0 讨论(0)
  • 2020-12-28 21:12

    Yes there is an official way to check if .NET Framework 4.5 is installed, even if it's not really friendly. From MSDN:

    You can test whether the .NET Framework 4.5 or the .NET Framework 4 is installed by checking the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full subkey in the registry for a DWORD value named Release. The existence of this DWORD indicates that the .NET Framework 4.5 has been installed on that computer. The value of Release is a version number. To determine if the final release version of the .NET Framework 4.5 is installed, check for a value that is equal to or greater than 378389.

    http://msdn.microsoft.com/en-us/library/hh925568.aspx

    It means you first have to check if 4.0 is installed and then to check if there is a value named Release in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full, if so then 4.5 is already installed (I think you can skip the check for a pre-release version).

    EDIT: check this post here on SO for details about detecting older installed .NET versions and this MSDN article to distinguish between for 4.5.x versions.

    0 讨论(0)
  • 2020-12-28 21:14

    If you're looking for options with .net framework 4.0+ (and above) including

    • .net 4.5
    • .net 4.5.1

    you can also check this plug-in for NSIS: DotNetChecker

    0 讨论(0)
  • 2020-12-28 21:19

    Now that .NET Framework 4.5.1 is available the actual value of DWORD named Release in the registry needs to be checked, not just its existence.

    A value of 378758 means that .NET Framework 4.5.1 is installed, however, as described here this value is 378675 on Windows 8.1.

    0 讨论(0)
提交回复
热议问题