在NSIS下判断Microsoft .NET Framework版本并进行安装,网上的教程大多数都是以下的示例。然后在我实际使用中却发现有问题。
首先,我们在Function区段进行当前.NET版本判断:
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
然后,在Section区段进行.NET静默安装:
Section -.NET
Call GetNetFrameworkVersion
Pop $R1
${If} $R1 < '4.6.01590'
SetDetailsPrint textonly
nsSkinEngine::SetControlData "progressTip" "正在安装.NET Framework 4,请耐心等候..." "text"
SetDetailsPrint listonly
SetOutPath "$TEMP"
SetOverwrite on
File "..\Library\Microsoft .NET Framework 4.6.2.exe"
ExecWait '$TEMP\Microsoft .NET Framework 4.6.2 /q /norestart /ChainingPackage FullX64Bootstrapper' $R1
Delete "$TEMP\Microsoft .NET Framework 4.6.2.exe"
${EndIf}
SectionEnd
问题重现:
计算机已安装.NET Framework 4.5.2,实际需要安装.NET Framework 4.6.2,这时按如上写法是不会安装.NET Framework 4.6.2的。
原因分析:
经输出日志发现,问题出现在
${If} $R1 < '4.6.01590'
这一句上。$R1获取到的值为4.5.51209 (.NET Framework 4.6.2对应版本为4.6.01590),实际是没有执行IF语句块。
解决办法:
因为我不知道如何让
${If} $R1 < '4.6.01590'
语句生效,所以我采用了其它写法。写法如下
Section -.NET Framework
Call GetNetFrameworkVersion
Pop $R1
${VersionCompare} $R1 '4.6.01590' $1
${If} $1 == '2'
SetDetailsPrint textonly
nsSkinEngine::SetControlData "progressTip" "正在安装.NET Framework 4.6.2,请耐心等候..." "text"
SetDetailsPrint listonly
SetOutPath "$TEMP"
SetOverwrite on
File "..\Library\Microsoft .NET Framework 4.6.2.exe"
ExecWait '$TEMP\Microsoft .NET Framework 4.6.2 /q /norestart /ChainingPackage FullX64Bootstrapper' $R1
Delete "$TEMP\Microsoft .NET Framework 4.6.2.exe"
${EndIf}
SectionEnd
需要注意的是必须在脚本前面引用!include “WordFunc.nsh”
。因为VersionCompare函数存在于此文件中。
目前开发的程序以基于
.net
的应用程序为主,程序开发好后,需要进行
安装
包的生成,及setup文件的生成。
常见的是
NSIS
工具,之前一直用的单文件
打包
工具,不适合将运行环境加进去,因此开始使用更高版本的
NSIS
3.06。
关于
判断
.NET
Framework
运行环境 (离线
安装
)
首先添加头文件: 用来版本比较
!include "WordFunc.nsh"
添加 GetNet
Framework
Version 函数,这里给出完整函数代码:
Function GetNet
Framework
这段时间在学习
nsis
打包
,遇到了一个问题,
nsis
脚本设置
.net
运行环境问题,在网上看了不少教程,但都不完整,这里给出一个我觉得
判断
.net
版本的连接:http://blog.csdn
.net
/aqtata/article/details/51814602这里是分版本
判断
电脑的
.net
是否
安装
,有了
判断
.net
是否
安装
的方法,剩下的就是调用,网上给出了很多调用此方法的例子,如:
Section
如果我们的软件开发的语言使用的是C#,使用的平台框架是Net.
Framework
,哪么在部署软件
安装
时,就需要考虑在
安装
过程检测是否需要
安装
net环境,并进行
安装
。
本文以ScreenToGif 这款软件为例,详细讲解如何在
安装
的过程中检测并下载net包进行
安装
。
1、ScreenToGif 是一款开源的截屏软件,依赖于Net.
Framework
环境
2、本文讲解的
NSIS
安装
过程为自定义界面,而非传统界面(需要传统界面的留言区留言)。
3、Win10系统好像是自动集成了Net.Fr..
参考资料[3]来做
S1:新建一个空的C++DLL项目,nsMessageBoxPlugin.
S2:复制“C:\Program Files (x86)\
NSIS
\Unicode\Examples\Plugin\
nsis
”文件夹到