NSIS-.NET Runtime Library检测和本地安装
如需转载,请注明原文出处!
好久没有更新Blog了。
一来是因为最近出差很多,断断续续的,根本没有心情写博客,二是最近不务正业了将近一个星期,看了近一个星期的小说。
言归正传,这篇Blog还是关于NSIS。由于需要将C#开发的一个WinForm程序给客户,但是不知道对方是否安装了.NET Framework 2.0,所以做安装包时就将.NET Runtime Library一起打包了(地球人都知道天朝的网络环境是多么恶劣,不能指望能够安装时在线下载这种方式的)。
那么NSIS安装脚本运行时,最开始要做的事就是判断1.是否有安装 .NET Framework , 2.若已安装,则判断已安装版本是否是最低要求版本(这里是2.0)。代码如下:
Function .onInit
Call GetDotNETVersion
Pop $0
${If} $0 == "not found"
MessageBox MB_OK|MB_ICONSTOP ".NET环境运行环境没有安装!."
Call InstallDotNetFx
;Abort
${EndIf}
StrCpy $0 $0 "" 1 # skip "v"
${VersionCompare} $0 "2.0" $1
${If} $1 == 2
MessageBox MB_OK|MB_ICONSTOP "需要.NET运行库版本v2.0 或者 更新版本. 当前系统安装的版本为 $0."
;Abort
Call InstallDotNetFx
${EndIf}
FunctionEnd
安装程序进入.onInit代码段后,首先Call了GetDotNETVersion函数。
GetDotNETVersion函数如下
Function GetDotNETVersion
Push $0
Push $1
System::Call "mscoree::GetCORVersion(w .r0, i ${NSIS_MAX_STRLEN}, *i) i .r1 ?u"
StrCmp $1 0 +2
StrCpy $0 "not found"
Pop $1
Exch $0
FunctionEnd
在调用GetDotNETVersion函数后,开始判断.NET运行库版本是否存在,如果不存在则调用InstallDotNetFx函数。安装本地的.NET Framework安装dotnetfx.exe
Function InstallDotNetFx
SetOutPath "$PLUGINSDIR"
File /r "dotnetfx.exe"
Banner::show /NOUNLOAD "正在安装.NET运行库,请耐心等待..."
nsExec::ExecToStack '"dotnetfx.exe" /q /c:"install.exe /noaspupgrade /q"'
Banner::destroy
FunctionEnd
若.NET运行库存在,则开始比较安装需要的最低版本和当前已安装的版本,如果达不到最低版本要求,则安装更高版本(这里是2.0)。做完这些准备工作后,就可以安装其他部分程序了。
很简单,是不是? 很正确,是不是?这就不一定了!
为什么?
当我最开始使用这种方法时,我也觉得没什么问题。但是当我尝试将版本比较中的2.0换成3.5时,问题出现了。
${VersionCompare} $0 "2.0" $1
VersionCompare版本比较函数,详细请见http://nsis.sourceforge.net/VersionCompare
尽管我的电脑上已经安装了v3.5的.NET Framework,但是通过使用
System::Call "mscoree::GetCORVersion(w .r0, i ${NSIS_MAX_STRLEN}, *i) i .r1 ?u"得到当前.NET环境始终是v2.0.50727,为什么?后来通过Google,才发现问题。在调用GetCORVersion时,实际上是检测..\WINDOWS\Microsoft.NET\Framework\v2.0.50727或者1.1.4322等等文件夹中mscoree.dll的版本。但是在v3.0以及v3.5中是找不到mscoree.dll文件的。具体原因下面连接中讲的很清楚了。
在此引用原文中的一张图。
http://www.danielmoth.com/Blog/2007/06/net-framework-35.html
http://social.msdn.microsoft.com/Forums/en-US/netfxsetup/thread/62218f1c-000f-4873-8dc6-0edbc3991523
此方法原始出处:http://nsis.sourceforge.net/Get_.NET_Version
因此前面文章中所提供的方法对于最低运行版本为v2.0的程序是可以使用的,如果最低版本高于2.0,比如3.5等版本,则需要使用其他方法,比如读取注册表,这个内容会在以后NSIS系列中讲到的。敬请期待!