前言
目前开发的程序以基于.net的应用程序为主,程序开发好后,需要进行安装包的生成,及setup文件的生成。
常见的是NSIS工具,之前一直用的单文件打包工具,不适合将运行环境加进去,因此开始使用更高版本的NSIS 3.06。
关于判断.NET Framework运行环境 (离线安装)
- 首先添加头文件: 用来版本比较
!include ""
- 添加
GetNetFrameworkVersion
函数,这里给出完整函数代码:
Function GetNetFrameworkVersion
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\v4\Client" "Install"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" "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
- 最后,在Section区段进行比较版本号并静默安装.NET:
Section -.NET
Call GetNetFrameworkVersion
Pop $R1
${VersionCompare} "4.0.30319" "$R1" $R2
${If} $R2 == 1
SetDetailsPrint textonly
DetailPrint "正在安装 .NET Framework 4"
SetDetailsPrint listonly
SetOutPath "$TEMP"
SetOverwrite on
File "dotNetFx40_Full_x86_x64.exe"
ExecWait '"$TEMP\dotNetFx40_Full_x86_x64.exe" /q /norestart /ChainingPackage FullX64Bootstrapper'
Delete "$TEMP\dotNetFx40_Full_x86_x64.exe"
${EndIf}
SectionEnd
这里的dotNetFx40_Full_x86_x64.exe放在脚本路径下就可以,编译会自动打包到一个文件里面去。
附录
最后附上一个比较版本号的section:
Section - "比较版本号"
Call GetNetFrameworkVersion
Pop $R1
${VersionCompare} "4.0.30319" "$R1" $R2
${If} $R2 == 0
MessageBox MB_OK "版本相同($R1)"
${ElseIf} $R2 == 1
MessageBox MB_OK "已安装版本低($R1)"
${ElseIf} $R2 == 2
MessageBox MB_OK "已安装版本高($R1)"
${EndIf}
SectionEnd