NSIS中判断.net framework 是否安装
在网上找了几个脚本,原理都是读取注册表进行判断,都可以用。
1、CheckDotNetFramework
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | /* * Name: CheckDotNetFramework.nsh * Version: 0.1 * Date: 20110720 * * Author: Michael Mefford * Contact info: meffordm@gmail.com * * Description: NSIS header file to check a windows system for a specified .NET * framework. CheckDotNetFramework.nsh uses the NSIS stack to * receive and pass values. * * Modified from: http://nsis.sourceforge.net/How_to_Detect_any_.NET_Framework * * License: Copyright (C) 2011 Michael Mefford * * This software is provided 'as-is', without any express or implied * warranty. In no event will the author(s) be held liable for any * damages arising from the use of this software. * * Permission is granted to anyone to use this software for any * purpose, including commercial applications, and to alter it and * redistribute it freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; * you must not claim that you wrote the original software. * If you use this software in a product, an acknowledgment in * the product documentation would be appreciated but is not * required. * * 2. Altered versions must be plainly marked as such, * and must not be misrepresented as being the original software. * * 3. This notice may not be removed or altered from any * distribution. * * Usage: Push ${DotNetFrameworkVersion} * Call CheckDotNetFramework * Exch $R0 * StrCmp $R0 "0" found not_found * * Algorithm: ... * * Input: A .NET Framework version. This must be verbatim, including major, * minor, and build version - i.e. * * 1.1.4322 * 2.0.50727 * 3.0 * 3.5 * 4 * 4.0 * . * . * . * etc. * * Output: "0" if the requested .Net Framework version IS FOUND * "1" if the requested .NET Framework version IS NOT FOUND * */ Function CheckDotNetFramework /* Exchange $R0 with the top of the stack to get the value passed by caller */ Exch $R0 /* Save other NSIS registers */ Push $R1 Push $R2 Push $R3 /* Zero out $R2 for the indexer */ StrCpy $R3 "0" loop: /* Get each sub key under "SOFTWARE\Microsoft\NET Framework Setup\NDP" */ EnumRegKey $R1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $R3 StrCmp $R1 "" version_not_found /* Requested version is not found */ StrCpy $R2 $R1 "" 1 /* Remove "v" from subkey */ StrCmp $R2 $R0 version_found /* Requested version is found */ IntOp $R3 $R3 + 1 /* Increment registry key index */ Goto loop /* The requested .Net Framework version WAS NOT FOUND on this system */ version_not_found: /* Restore the registers saved earlier */ Pop $R3 Pop $R2 Pop $R1 Pop $R0 Push "1" /* Put "1" on the top of the stack for caller to use */ Goto end /* The requested .Net Framework version WAS FOUND on this system */ version_found: /* Restore the registers saved earlier */ Pop $R3 Pop $R2 Pop $R1 Pop $R0 Push "0" /* Put "0" on the top of the stack for caller to use */ end: FunctionEnd<br><br> ;检查是否安装了3.5 StrCpy $DotNetFrameworkVersion 3.5 Push $DotNetFrameworkVersion Call CheckDotNetFramework Exch $R0 ${If} $R0 == "1" ; 没有找到 MessageBox MB_ICONSTOP|MB_OK "程序运行所必需的 Microsoft .NET Framework$DotNetFrameworkVersion 尚未安装,请先安装该组件。" IDYES abort ${ElseIf} $R0 == "0" ; 找到指定版本的DotNetFramework ;检查是否安装了4.0 pop $DotNetFrameworkVersion StrCpy $DotNetFrameworkVersion 4.0 Push $DotNetFrameworkVersion Call CheckDotNetFramework Exch $R0 ${If} $R0 == "1" MessageBox MB_ICONSTOP|MB_OK "程序运行所必需的 Microsoft .NET Framework$DotNetFrameworkVersion 尚未安装,请先安装该组件。" IDYES abort ${EndIf} ${Endif} Function GetNetFrameworkVersion ;获取.Net Framework版本支持 Push $1 Push $0 ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install" ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Version" StrCmp $0 1 KnowNetFrameworkVersion +1 ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install" ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version" StrCmp $0 1 KnowNetFrameworkVersion +1 ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess" ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version" StrCmp $0 1 KnowNetFrameworkVersion +1 ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install" ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version" StrCmp $1 "" +1 +2 StrCpy $1 "2.0.50727.832" StrCmp $0 1 KnowNetFrameworkVersion +1 ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install" ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version" StrCmp $1 "" +1 +2 StrCpy $1 "1.1.4322.573" StrCmp $0 1 KnowNetFrameworkVersion +1 ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install" ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version" StrCmp $1 "" +1 +2 StrCpy $1 "1.0.3705.0" StrCmp $0 1 KnowNetFrameworkVersion +1 StrCpy $1 "not .NetFramework" KnowNetFrameworkVersion: Pop $0 Exch $1 FunctionEnd |
使用方法:
2、GetNetFrameworkVersion
使用方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Call GetNetFrameworkVersion Pop $1 ${If} $1 < '2.0.50727' MessageBox MB_OK "正在安装 .NET Framework..." SetDetailsPrint textonly DetailPrint "正在安装 .NET Framework..." SetDetailsPrint listonly SetOutPath "$TEMP" SetOverwrite on ;File "NetFx20SP2_x86.exe" ExecWait '$TEMP\NetFx20SP2_x86.exe /quiet /norestart' $R1 Delete "$TEMP\NetFx20SP2_x86.exe" ${EndIf} |
3、封装成宏
这种方式不用在脚本中添加函数代码,复用性好,有两个缺点:1)不能在一个脚本中调用多次进行多个版本的判断;2)参数中必须传入DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR,如果想查4或者4.0版本,脚本中会变成4.或者4.0.,造成找不到,需要改写一下这个脚本,限于目前自己的水平,还改不了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | !macro DotNetSearch DOTNETVMAJOR DOTNETVMINOR DOTNETVMINORMINOR DOTNETLASTFUNCTION DOTNETPATH Var /GLOBAL DOTNET1 Var /GLOBAL DOTNET2 Var /GLOBAL DOTNET3 Var /GLOBAL DOTNET4 Var /GLOBAL DOTNET5 Var /GLOBAL DOTNET6 Push $DOTNET1 Push $DOTNET2 Push $DOTNET3 Push $DOTNET4 Push $DOTNET5 Push $DOTNET6 StrCpy $DOTNET1 "0" StrCpy $DOTNET2 "SOFTWARE\Microsoft\.NETFramework" StrCpy $DOTNET3 0 DotNetStartEnum: EnumRegKey $DOTNET4 HKLM "$DOTNET2\policy" $DOTNET3 StrCmp $DOTNET4 "" noDotNet dotNetFound dotNetFound: StrCpy $DOTNET5 $DOTNET4 1 0 StrCmp $DOTNET5 "v" +1 goNextDotNet StrCpy $DOTNET5 $DOTNET4 1 1 IntCmp $DOTNET5 ${DOTNETVMAJOR} +1 goNextDotNet yesDotNetReg StrCpy $DOTNET5 $DOTNET4 1 3 IntCmp $DOTNET5 ${DOTNETVMINOR} +1 goNextDotNet yesDotNetReg StrCmp ${DOTNETVMINORMINOR} "" yesDotNetReg yesDotNetReg ;StrCmp ${DOTNETVMINORMINOR} "" yesDotNetReg +1 ;Changed this line (otherwise it would not work with my setup!) - Vinz0r IntCmpU $DOTNET5 ${DOTNETVMINORMINOR} yesDotNetReg goNextDotNet yesDotNetReg goNextDotNet: IntOp $DOTNET3 $DOTNET3 + 1 Goto DotNetStartEnum yesDotNetReg: EnumRegValue $DOTNET3 HKLM "$DOTNET2\policy\$DOTNET4" 0 StrCmp $DOTNET3 "" noDotNet ReadRegStr $DOTNET5 HKLM $DOTNET2 "InstallRoot" StrCmp $DOTNET5 "" noDotNet StrCpy $DOTNET5 "$DOTNET5$DOTNET4.$DOTNET3\mscorlib.dll" IfFileExists $DOTNET5 yesDotNet noDotNet noDotNet: StrCmp ${DOTNETLASTFUNCTION} "INSTALL_ABORT" +1 nDN2 MessageBox MB_YESNO|MB_ICONQUESTION \ "You must have Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR}$\nor higher installed. Install now?" \ IDYES +2 IDNO +1 Abort ExecWait '${DOTNETPATH}' Goto DotNetStartEnum nDN2: StrCmp ${DOTNETLASTFUNCTION} "INSTALL_NOABORT" +1 nDN3 MessageBox MB_YESNO|MB_ICONQUESTION \ "Microsoft .NET Framework version ${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed.$\nDo so now?" \ IDYES +1 IDNO +3 ExecWait '${DOTNETPATH}' Goto DotNetStartEnum StrCpy $DOTNET1 0 Goto DotNetFinish nDN3: StrCmp ${DOTNETLASTFUNCTION} "WARNING" +1 nDN4 MessageBox MB_OK|MB_ICONEXCLAMATION \ "Warning:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed!" \ IDOK 0 StrCpy $DOTNET1 0 Goto DotNetFinish nDN4: StrCmp ${DOTNETLASTFUNCTION} "ABORT" +1 nDN5 MessageBox MB_OK|MB_ICONEXCLAMATION \ "Error:$\n$\n$\t$\tMicrosoft .NET Framework version$\n$\t$\t${DOTNETVMAJOR}.${DOTNETVMINOR}.${DOTNETVMINORMINOR} is not installed, aborting!" \ IDOK 0 Abort nDN5: StrCmp ${DOTNETLASTFUNCTION} "IGNORE" +1 nDN6 StrCpy $DOTNET1 0 Goto DotNetFinish nDN6: MessageBox MB_OK \ "$(^Name) Setup internal error.$\nMacro 'DotNetSearch', parameter '4'(${DOTNETLASTFUNCTION})invalid.$\nValue must be INSTALL_ABORT|INSTALL_NOABORT|WARNING|ABORT|IGNORE$\nSorry for the inconvenience.$\n$\tAborting..." \ IDOK 0 Abort yesDotNet: StrCpy $DOTNET1 1 DotNetFinish: Pop $DOTNET6 Pop $DOTNET5 Pop $DOTNET4 Pop $DOTNET3 Pop $DOTNET2 !define ${DOTNETOUTCOME} $DOTNET1 Exch $DOTNET1 !macroend |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具