杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2114|回复: 0

NSIS-.NET Runtime Library检测和本地安装

[复制链接]
发表于 2016-9-2 14:21:18 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Share 于 2016-9-2 14:22 编辑

由于需要将C#开发的一个WinForm程序给客户,但是不知道对方是否安装了.NET Framework 2.0,所以做安装包时就将.NET Runtime Library一起打包了(地球人都知道天朝的网络环境是多么恶劣,不能指望能够安装时在线下载这种方式的)。
那么NSIS安装脚本运行时,最开始要做的事就是判断1.是否有安装 .NET Framework , 2.若已安装,则判断已安装版本是否是最低要求版本(这里是2.0)。代码如下:
  1. Function .onInit
  2.     Call GetDotNETVersion
  3.     Pop $0
  4.     ${If} $0 == "not found"
  5.     MessageBox MB_OK|MB_ICONSTOP ".NET环境运行环境没有安装!."
  6.     Call InstallDotNetFx
  7.     ;Abort
  8.     ${EndIf}

  9.     StrCpy $0 $0 "" 1 # skip "v"

  10.     ${VersionCompare} $0 "2.0" $1
  11.     ${If} $1 == 2
  12.       MessageBox MB_OK|MB_ICONSTOP "需要.NET运行库版本v2.0 或者 更新版本. 当前系统安装的版本为 $0."
  13.       ;Abort
  14.       Call InstallDotNetFx
  15.     ${EndIf}

  16. FunctionEnd
复制代码

安装程序进入.onInit代码段后,首先Call了GetDotNETVersion函数。
GetDotNETVersion函数如下
  1. Function GetDotNETVersion
  2.   Push $0
  3.   Push $1

  4.   System::Call "mscoree::GetCORVersion(w .r0, i ${NSIS_MAX_STRLEN}, *i) i .r1 ?u"
  5.   StrCmp $1 0 +2
  6.     StrCpy $0 "not found"

  7.   Pop $1
  8.   Exch $0
  9. FunctionEnd
复制代码


在调用GetDotNETVersion函数后,开始判断.NET运行库版本是否存在,如果不存在则调用InstallDotNetFx函数。安装本地的.NET Framework安装dotnetfx.exe
  1. Function InstallDotNetFx
  2.     SetOutPath "$PLUGINSDIR"
  3.     File /r "dotnetfx.exe"
  4.     Banner::show /NOUNLOAD "正在安装.NET运行库,请耐心等待..."
  5.     nsExec::ExecToStack '"dotnetfx.exe" /q /c:"install.exe /noaspupgrade /q"'
  6.     Banner::destroy
  7. 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文件的。具体原因下面连接中讲的很清楚了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-17 23:52 , Processed in 0.116263 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表