简体   繁体   English

检查.NET Framework的NSIS安装程序

[英]NSIS installer that checks for .NET Framework

I want to create an NSIS installer that checks for the .NET Framework and installs it if it's not there. 我想创建一个NSIS安装程序,检查.NET Framework并安装它,如果不存在的话。 Can you point me to a script for this? 你能指点我这个剧本吗? I'm very new to NSIS. 我对NSIS很新。

Try the DotNetVer script. 试试DotNetVer脚本。 It uses LogicLib and is quite easy to use. 它使用LogicLib ,非常易于使用。

  • HasDotNet<version> checks if the specific version of .NET framework is installed. HasDotNet <version>检查是否安装了特定版本的.NET框架。 <version> can be replaced with the following values: 1.0, 1.1, 2.0, 3.0, 3.5, 4.0. <version>可以替换为以下值: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. AtLeastDotNetServicePack检查.NET框架是否至少具有指定的Service Pack版本。
  • IsDotNetServicePack checks if the .NET framework has a service pack version exactly as specified. IsDotNetServicePack检查.NET框架是否具有完全符合指定的Service Pack版本。
  • HasDotNetClientProfile checks if the .NET framework is a client profiled install. HasDotNetClientProfile检查.NET框架是否为客户端配置文件安装。
  • HasDotNetFullProfile checks if the .NET framework is a full install. HasDotNetFullProfile检查.NET框架是否为完整安装。

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}

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): 我遇到了“DotNET.nsh”插件的问题,您可以找到somwhere,并且只是使用此解决方案(对于.net 4.0,完全安装 - 我需要,您也可以将其限制为客户端包):

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. 横幅内容是可选的,您可以使用DetailPrint等。 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). 这样,您可以使用.NET 4.0的Web安装程序,但它非常小(而不是没有.NET版本的.NET版本)。 The installer does the downloading if it's needed, and you don't need kilometers of NSIS code. 如果需要,安装程序会进行下载,并且您不需要数公里的NSIS代码。

!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

If you're looking for options with .net framework 4.0+ (and above) including 如果您正在寻找.net framework 4.0+(及以上)的选项,包括

  • .net 4.5 .net 4.5
  • .net 4.5.1 .net 4.5.1

check this plug-in for NSIS: DotNetChecker 检查NSIS的这个插件: DotNetChecker

The following code checks if .Net 3.5 is installed, and if not, it will install it silently. 以下代码检查是否安装了.Net 3.5,如果没有安装.Net 3.5将以静默方式安装。 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). 为了使其工作,您必须在.onInit函数中的某处调用CheckDotNet ,并确保将dotnetfx35.exe打包在$EXEDIR中的安装程序中(当然您可以根据需要更改这些参数)。

For other versions of .Net, I suppose the only different thing will be the registry key specified in the IfKeyExists macro parameter (now it is {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9} ) 对于.Net的其他版本,我想唯一不同的是IfKeyExists宏参数中指定的注册表项(现在是{CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}

ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Install

Then you should check $0 . 然后你应该检查$0 It's up to you how. 这取决于你如何。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM