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

本文介绍了一种使用NSIS脚本检测系统是否已安装.NET Framework及其版本的方法,并提供了当未达到所需版本时安装指定.NET版本的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于需要将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文件的。具体原因下面连接中讲的很清楚了。

在此引用原文中的一张图。

image

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系列中讲到的。敬请期待!

 

参考文献

http://www.cnblogs.com/fangfan4060/archive/2009/08/17/1547790.html

http://blog.youkuaiyun.com/zxmcl/article/details/4830313

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值