NSIS:.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檔案的。具體原因下面連線中講的很清楚了。
在此引用原文中的一張圖。
因此前面文章中所提供的方法對於最低執行版本為v2.0的程式是可以使用的,如果最低版本高於2.0,比如3.5等版本,則需要使用其他方法,比如讀取登錄檔,這個內容會在以後NSIS系列中講到的。敬請期待!
參考文獻