Check for .NET4.5+ with NSIS

前端 未结 6 1864
暗喜
暗喜 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 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
    

提交回复
热议问题