1. 程式人生 > >NSIS:檢測本機.Net Framework版本

NSIS:檢測本機.Net Framework版本

為了實現檢測本機.Net Framework版本並在線下載安裝,我找到了這篇文章

主要函式是GetNetFrameworkVersion。作用是獲取本機.Net Framework最高版本號。
但是它忽略了.Net CLR版本的問題。先來看張圖


圖中顯示CLR版本只有3個:1.1、2.0、4
參考微軟官網說明其實還有一個1.0(https://msdn.microsoft.com/zh-cn/library/bb822049.aspx
在實際使用中,需要根據程式依賴的CLR版本來安裝對應的.Net Framework版本,而不是像文章開始提到的GetNetFrameworkVersion函式那樣,檢測到最高版本就完事了。
打個比方,我現在有個程式Hello.exe是通過.Net Framework 3.0來進行開發的,對應依賴CLR為2.0版本,那麼我就應該安裝基於CLR 2.0的.Net版本,而不能安裝基於CLR 4的.Net版本。
而如果採用GetNetFrameworkVersion的檢測辦法,我可能獲取到4.x版本,邏輯上大於2.0,就認為是安裝了.Net Framework,但是程式執行時提示需要某個版本的錯誤。
所以,我們在檢測時應該以CLR版本來檢測

; 獲取本機CLR 2.0的最高.Net版本
Function GetNetCLR2Version
  nsVariables::Save
  ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"
  ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"
  StrCmp $0 1 KnowNetFrameworkVersion +1

  ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"
  ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"
  StrCmp $0 1 KnowNetFrameworkVersion +1

  ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"
  ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"
  StrCmp $0 1 KnowNetFrameworkVersion +1
  
  StrCpy $1 "0"
  KnowNetFrameworkVersion:
  Push $1
  nsVariables::Load
FunctionEnd

; 獲取本機CLR 4的最高.Net版本
Function GetNetCLR4Version
  nsVariables::Save
  ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"
  ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Version"
  StrCmp $0 1 +2 +1
  StrCpy $1 "0"
  Push $1
  nsVariables::Load
FunctionEnd
另外附上一個小工具,用來檢測本機.Net Framework版本情況(http://www.asoft.be/prod_netver.html