NSIS installer that checks for .NET Framework

前端 未结 6 1906
忘了有多久
忘了有多久 2020-12-29 08:49

I want to create an NSIS installer that checks for the .NET Framework and installs it if it\'s not there. Can you point me to a script for this? I\'m very new to NSIS.

相关标签:
6条回答
  • 2020-12-29 09:25
    !define DOT_MAJOR "2"
    !define DOT_MINOR "0"
    
    Function IsDotNetInstalled
    
      StrCpy $0 "0"
      StrCpy $1 "SOFTWARE\Microsoft\.NETFramework" ;registry entry to look in.
      StrCpy $2 0
    
      StartEnum:
        ;Enumerate the versions installed.
        EnumRegKey $3 HKLM "$1\policy" $2
    
        ;If we don't find any versions installed, it's not here.
        StrCmp $3 "" noDotNet notEmpty
    
        ;We found something.
        notEmpty:
          ;Find out if the RegKey starts with 'v'.  
          ;If it doesn't, goto the next key.
          StrCpy $4 $3 1 0
          StrCmp $4 "v" +1 goNext
          StrCpy $4 $3 1 1
    
          ;It starts with 'v'.  Now check to see how the installed major version
          ;relates to our required major version.
          ;If it's equal check the minor version, if it's greater, 
          ;we found a good RegKey.
          IntCmp $4 ${DOT_MAJOR} +1 goNext yesDotNetReg
          ;Check the minor version.  If it's equal or greater to our requested 
          ;version then we're good.
          StrCpy $4 $3 1 3
          IntCmp $4 ${DOT_MINOR} yesDotNetReg goNext yesDotNetReg
    
        goNext:
          ;Go to the next RegKey.
          IntOp $2 $2 + 1
          goto StartEnum
    
      yesDotNetReg:
        ;Now that we've found a good RegKey, let's make sure it's actually
        ;installed by getting the install path and checking to see if the 
        ;mscorlib.dll exists.
        EnumRegValue $2 HKLM "$1\policy\$3" 0
        ;$2 should equal whatever comes after the major and minor versions 
        ;(ie, v1.1.4322)
        StrCmp $2 "" noDotNet
        ReadRegStr $4 HKLM $1 "InstallRoot"
        ;Hopefully the install root isn't empty.
        StrCmp $4 "" noDotNet
        ;build the actuall directory path to mscorlib.dll.
        StrCpy $4 "$4$3.$2\mscorlib.dll"
        IfFileExists $4 yesDotNet noDotNet
    
      noDotNet:
        ;Nope, something went wrong along the way.  Looks like the proper .NETFramework isn't installed.  
        Push "NOK"
        Return
    
      yesDotNet:
        ;Everything checks out.  Go on with the rest of the installation.
        Push "OK"
        Return
    
    FunctionEnd
    
    0 讨论(0)
  • 2020-12-29 09:32

    The following code checks if .Net 3.5 is installed, and if not, it will install it silently. It uses a macro that checks wether a specified key exists in the registry.

    The macro:

    # This macro checks if a certain key exists in the registry
    !macro IfKeyExists ROOT MAIN_KEY KEY
        push $R0
        push $R1
    
        !define Index 'Line${__LINE__}'
    
        StrCpy $R1 "0"
    
        "${Index}-Loop:"
        ; Check for Key
        EnumRegKey $R0 ${ROOT} "${MAIN_KEY}" "$R1"
        StrCmp $R0 "" "${Index}-False"
        IntOp $R1 $R1 + 1
        StrCmp $R0 "${KEY}" "${Index}-True" "${Index}-Loop"
    
        "${Index}-True:"
        ;Return 1 if found
        push "1"
        goto "${Index}-End"
    
        "${Index}-False:"
        ;Return 0 if not found
        push "0"
        goto "${Index}-End"
    
        "${Index}-End:"
        !undef Index
        exch 2
        pop $R0
        pop $R1
    !macroend
    

    The function:

    # The function that checks if .net is already installed
    Function CheckDotNet
    !insertmacro IfKeyExists HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "{CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}"
    Pop $R0
    ${If} $R0 == 0 # not installed NOTE: /q:a means this will be a silent installation
        ExecWait "$EXEDIR\dotnetfx35.exe /q:a"
        Goto endPrerequisites
    ${EndIf}
    
        endPrerequisites:
            # Code to execute after checking/installing (if necessary) .Net 
            # You can just put "Goto +2" here, in order to go to the next section/function
    FunctionEnd
    

    In order for this to work, you have to call CheckDotNet somewhere in the .onInit function and make sure that dotnetfx35.exe is packed in your installer in the $EXEDIR (of course you can change these parameters however you wish).

    For other versions of .Net, I suppose the only different thing will be the registry key specified in the IfKeyExistsmacro parameter (now it is {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9})

    0 讨论(0)
  • 2020-12-29 09:36
    ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Install
    

    Then you should check $0. It's up to you how.

    0 讨论(0)
  • 2020-12-29 09:40

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

    • .net 4.5
    • .net 4.5.1

    check this plug-in for NSIS: DotNetChecker

    0 讨论(0)
  • 2020-12-29 09:42

    I had an issue with the "DotNET.nsh" pluging, which you can find somwhere, and simply used this solution (for .net 4.0, full install - which I needed, you can as well limit it to the client package):

    ClearErrors
    ReadRegDWORD $0 HKLM "Software\Microsoft\Net Framework Setup\NDP\v4\Full" "Install"
    IfErrors dotNet40NotFound
    IntCmp $0 1 dotNet40Found
    dotNet40NotFound: 
        Banner::show /set 76 "Installing .NET Framework 4.0" "Please wait"  
        File /nonfatal "tools\dotNetFx40_Full_setup.exe"
        ; if you don't have $TEMP already, add here:
        ; SetOutPath $TEMP
        ExecWait "$TEMP\dotNetFx40_Full_setup.exe /passive /norestart"
        Delete /REBOOTOK "$TEMP\dotNetFx40_Full_setup.exe"
        Banner::destroy
    dotNet40Found:
    

    The banner stuff is optional, you could just use DetailPrint or the like. This way, you pull along the Web installer for .NET 4.0, but it's pretty small (as opposed to .NET versions which didn't have one). The installer does the downloading if it's needed, and you don't need kilometers of NSIS code.

    0 讨论(0)
  • 2020-12-29 09:43

    Try the DotNetVer script. It uses LogicLib and is quite easy to use.

    • HasDotNet<version> checks if the specific version of .NET framework is installed. <version> can be replaced with the following values: 1.0, 1.1, 2.0, 3.0, 3.5, 4.0.
    • AtLeastDotNetServicePack checks if the .NET framework has a service pack version at least as specified.
    • IsDotNetServicePack checks if the .NET framework has a service pack version exactly as specified.
    • HasDotNetClientProfile checks if the .NET framework is a client profiled install.
    • HasDotNetFullProfile checks if the .NET framework is a full install.

    Sample:

    ${If} ${HasDotNet4.0}
        DetailPrint "Microsoft .NET Framework 4.0 installed."
        ${If} ${DOTNETVER_4_0} AtLeastDotNetServicePack 1
            DetailPrint "Microsoft .NET Framework 4.0 is at least SP1."
        ${Else}
            DetailPrint "Microsoft .NET Framework 4.0 SP1 not installed."
        ${EndIf}
        ${If} ${DOTNETVER_4_0} HasDotNetClientProfile 1
            DetailPrint "Microsoft .NET Framework 4.0 (Client Profile) available."
        ${EndIf}
        ${If} ${DOTNETVER_4_0} HasDotNetFullProfile 1
            DetailPrint "Microsoft .NET Framework 4.0 (Full Profile) available."
        ${EndIf}
        ${If} ${DOTNETVER_4_0} HasDotNetFullProfile 0
            DetailPrint "Microsoft .NET Framework 4.0 (Full Profile) not available."
        ${EndIf}
    ${EndIf}
    
    0 讨论(0)
提交回复
热议问题