1. 程式人生 > >NSIS:.NET Runtime Library檢測和本地安裝

NSIS:.NET Runtime Library檢測和本地安裝

由於需要將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

儘管我的電腦上已經安裝了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

因此前面文章中所提供的方法對於最低執行版本為v2.0的程式是可以使用的,如果最低版本高於2.0,比如3.5等版本,則需要使用其他方法,比如讀取登錄檔,這個內容會在以後NSIS系列中講到的。敬請期待!

參考文獻