Проверьте для.NET4.5+ с NSIS
Все, мне известны следующие способы проверки версии фреймворка в NSIS. Для.NET4.0+ я сейчас использую
Function IsDotNetInstalled
StrCpy $0 "0"
StrCpy $1 "SOFTWARE\Microsoft\.NETFramework" ; Registry entry to look in.
StrCpy $2 0
StartEnum:
; Enumerate the versions installed.
EnumRegKey $3 HKLM "$1\policy" $2
; If we don't find any versions installed, it's not here.
StrCmp $3 "" noDotNet notEmpty
; We found something.
notEmpty:
; Find out if the RegKey starts with 'v'.
; If it doesn't, goto the next key.
StrCpy $4 $3 1 0
StrCmp $4 "v" +1 goNext
StrCpy $4 $3 1 1
; It starts with 'v'. Now check to see how the installed major version
; relates to our required major version.
; If it's equal check the minor version, if it's greater,
; we found a good RegKey.
IntCmp $4 ${DOT_MAJOR} +1 goNext yesDotNetReg
; Check the minor version. If it's equal or greater to our requested
; version then we're good.
StrCpy $4 $3 1 3
IntCmp $4 ${DOT_MINOR} yesDotNetReg goNext yesDotNetReg
goNext:
; Go to the next RegKey.
IntOp $2 $2 + 1
goto StartEnum
yesDotNetReg:
; Now that we've found a good RegKey, let's make sure it's actually
; installed by getting the install path and checking to see if the
; mscorlib.dll exists.
EnumRegValue $2 HKLM "$1\policy\$3" 0
; $2 should equal whatever comes after the major and minor versions
; (ie, v1.1.4322)
StrCmp $2 "" noDotNet
ReadRegStr $4 HKLM $1 "InstallRoot"
; Hopefully the install root isn't empty.
StrCmp $4 "" noDotNet
; Build the actuall directory path to mscorlib.dll.
StrCpy $4 "$4$3.$2\mscorlib.dll"
IfFileExists $4 yesDotNet noDotNet
noDotNet:
; No, something went wrong along the way. Looks like the
; proper .NET Framework isn't installed.
MessageBox MB_ICONEXCLAMATION "To install UserCost, Microsoft's .NET Framework v${DOT_MAJOR}.${DOT_MINOR} \
(or higher) must be installed. Cannot proceed with the installation!"
${OpenURL} "${WWW_MS_DOTNET4}"
Abort
yesDotNet:
; Everything checks out. Proceed with the rest of the installation.
FunctionEnd
Это очень хорошо работает для.NET4.0, но я теперь расширил свое приложение, чтобы использовать async
/ await
функции и впоследствии нужны пользователи для установки.NET4.5+. Описанный выше метод не подходит, так как установка для.NET4.5 теперь не использует путь повторной регистрации "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\Policy" для хранения любой новой информации, то есть этот путь, по-видимому, не содержит значения, которое изменения между.NET4.0 и 4.5. Теперь я видел следующие сообщения:
который использует путь / запись реестра "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" для выполнения проверок. Теперь это также работает бот, так как запись не меняется с.NET4.0 на 4.5. Я заметил, что есть запись "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\v4.0.30319\SKUs.NETFramework,Version=v4.5". Могу ли я использовать ее для проверки версии Framework неизменно?
Есть ли официальная линия для проверки.NET4.5 с использованием NSIS?
Спасибо за ваше время.
Примечание: впоследствии некоторые установки.NET4.5, выполненные моими пользователями, имели значения реестра для
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
значение DWORD с именем Release
не было 378389
но 378181
, Внесение этого изменения, казалось, решило проблему как запись для Release
отсутствует в реестре для.NET4.5 и ниже.
6 ответов
Да, есть официальный способ проверить, установлен ли.NET Framework 4.5, даже если он не очень дружелюбный. Из MSDN:
Вы можете проверить, установлен ли.NET Framework 4.5 или.NET Framework 4, проверив
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
подключ в реестре дляDWORD
значение по имениRelease
, Существование этогоDWORD
указывает, что.NET Framework 4.5 был установлен на этом компьютере. Значение Release является номером версии. Чтобы определить, установлена ли окончательная версия.NET Framework 4.5, проверьте значение, равное или большее, чем 378389.
Это означает, что вы должны сначала проверить, установлен ли 4.0, а затем проверить, есть ли значение с именем Release
в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
, если так, то 4.5 уже установлен (я думаю, вы можете пропустить проверку для предварительной версии).
РЕДАКТИРОВАТЬ: проверьте этот пост здесь на SO для деталей об обнаружении более старых установленных версий.NET и этой статье MSDN, чтобы различать версии 4.5.x.
Вот функция, которую я написал, которая проверяет и загружает, если необходимо, .NET 4.5. Кроме того, код также ищет локальную копию установщика.NET - на случай, если вы поместите свой установщик на CD или USB-накопитель или что-то еще. Поддерживает установки Silent и Non-Silent, а также установку флага перезагрузки. Функция является автономной, но ожидает, что вы включите LogicLib (которая входит в базовую установку NSIS).
Это код, который я написал для того, что будет установщиком для моих книг по истории Рэйчел.
Function CheckAndDownloadDotNet45
# Let's see if the user has the .NET Framework 4.5 installed on their system or not
# Remember: you need Vista SP2 or 7 SP1. It is built in to Windows 8, and not needed
# In case you're wondering, running this code on Windows 8 will correctly return is_equal
# or is_greater (maybe Microsoft releases .NET 4.5 SP1 for example)
# Set up our Variables
Var /GLOBAL dotNET45IsThere
Var /GLOBAL dotNET_CMD_LINE
Var /GLOBAL EXIT_CODE
ReadRegDWORD $dotNET45IsThere HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Release"
IntCmp $dotNET45IsThere 378389 is_equal is_less is_greater
is_equal:
Goto done_compare_not_needed
is_greater:
# Useful if, for example, Microsoft releases .NET 4.5 SP1
# We want to be able to simply skip install since it's not
# needed on this system
Goto done_compare_not_needed
is_less:
Goto done_compare_needed
done_compare_needed:
#.NET Framework 4.5 install is *NEEDED*
# Microsoft Download Center EXE:
# Web Bootstrapper: http://go.microsoft.com/fwlink/?LinkId=225704
# Full Download: http://go.microsoft.com/fwlink/?LinkId=225702
# Setup looks for components\dotNET45Full.exe relative to the install EXE location
# This allows the installer to be placed on a USB stick (for computers without internet connections)
# If the .NET Framework 4.5 installer is *NOT* found, Setup will connect to Microsoft's website
# and download it for you
# Reboot Required with these Exit Codes:
# 1641 or 3010
# Command Line Switches:
# /showrmui /passive /norestart
# Silent Command Line Switches:
# /q /norestart
# Let's see if the user is doing a Silent install or not
IfSilent is_quiet is_not_quiet
is_quiet:
StrCpy $dotNET_CMD_LINE "/q /norestart"
Goto LookForLocalFile
is_not_quiet:
StrCpy $dotNET_CMD_LINE "/showrmui /passive /norestart"
Goto LookForLocalFile
LookForLocalFile:
# Let's see if the user stored the Full Installer
IfFileExists "$EXEPATH\components\dotNET45Full.exe" do_local_install do_network_install
do_local_install:
# .NET Framework found on the local disk. Use this copy
ExecWait '"$EXEPATH\components\dotNET45Full.exe" $dotNET_CMD_LINE' $EXIT_CODE
Goto is_reboot_requested
# Now, let's Download the .NET
do_network_install:
Var /GLOBAL dotNetDidDownload
NSISdl::download "http://go.microsoft.com/fwlink/?LinkId=225704" "$TEMP\dotNET45Web.exe" $dotNetDidDownload
StrCmp $dotNetDidDownload success fail
success:
ExecWait '"$TEMP\dotNET45Web.exe" $dotNET_CMD_LINE' $EXIT_CODE
Goto is_reboot_requested
fail:
MessageBox MB_OK|MB_ICONEXCLAMATION "Unable to download .NET Framework. ${PRODUCT_NAME} will be installed, but will not function without the Framework!"
Goto done_dotNET_function
# $EXIT_CODE contains the return codes. 1641 and 3010 means a Reboot has been requested
is_reboot_requested:
${If} $EXIT_CODE = 1641
${OrIf} $EXIT_CODE = 3010
SetRebootFlag true
${EndIf}
done_compare_not_needed:
# Done dotNET Install
Goto done_dotNET_function
#exit the function
done_dotNET_function:
FunctionEnd
В конце я пошел со следующей функцией, которая использует ответ выше. Этот метод сначала создает каталог "$INSTDIR\dotNETFramework"
который содержит веб-установщик.NET:
Function CheckAndInstallDotNet
; Installer dotNetFx45_Full_setup.exe avalible from http://msdn.microsoft.com/en-us/library/5a4x27ek.aspx
; Magic numbers from http://msdn.microsoft.com/en-us/library/ee942965.aspx
ClearErrors
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Release"
IfErrors NotDetected
${If} $0 >= 378389
DetailPrint "Microsoft .NET Framework 4.5 is installed ($0)"
${Else}
NotDetected:
MessageBox MB_YESNO|MB_ICONQUESTION ".NET Framework 4.5+ is required for ProgramX2013, \
do you want to launch the web installer? This requires a valid internet connection." IDYES InstallDotNet IDNO Cancel
Cancel:
MessageBox MB_ICONEXCLAMATION "To install ProgramX, Microsoft's .NET Framework v${DOT_MAJOR}.${DOT_MINOR} \
(or higher) must be installed. Cannot proceed with the installation!"
${OpenURL} "${WWW_MS_DOTNET4_5}"
RMDir /r "$INSTDIR"
SetOutPath "$PROGRAMFILES"
RMDir "$INSTDIR"
Abort
; Install .NET4.5.
InstallDotNet:
DetailPrint "Installing Microsoft .NET Framework 4.5"
SetDetailsPrint listonly
ExecWait '"$INSTDIR\dotNETFramework\dotNetFx45_Full_setup.exe" /passive /norestart' $0
${If} $0 == 3010
${OrIf} $0 == 1641
DetailPrint "Microsoft .NET Framework 4.5 installer requested reboot."
SetRebootFlag true
${EndIf}
SetDetailsPrint lastused
DetailPrint "Microsoft .NET Framework 4.5 installer returned $0"
${EndIf}
; Now remove the dotNETFramework directory and contents.
RMDir /r "$INSTDIR\dotNETFramework"
FunctionEnd
Этот метод, похоже, запускает установщик.NET4.5, если есть подключение к Интернету, и возвращается после завершения установки.
Я надеюсь, что это помогает кому-то еще.
Вот простая функция NSIS, которая проверяет версии.NET (работает для 4.5, 4.5.1, 4.5.2 и 4.6). Числовые сравнения основаны на MSDN.
Поместите функцию в свой файл NSIS и вызывайте ее так
Call CheckForDotVersion45Up
Pop $0
DetailPrint $0
Вот функция.
; returns a numeric value on the stack, ranging from 0 to 450, 451, 452 or 460. 0 means nothing found, the other values mean at least that version
Function CheckForDotVersion45Up
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Release
IntCmp $0 393295 is46 isbelow46 is46
isbelow46:
IntCmp $0 379893 is452 isbelow452 is452
isbelow452:
IntCmp $0 378675 is451 isbelow451 is451
isbelow451:
IntCmp $0 378389 is45 isbelow45 is45
isbelow45:
Push 0
Return
is46:
Push 460
Return
is452:
Push 452
Return
is451:
Push 451
Return
is45:
Push 45
Return
FunctionEnd
Теперь, когда доступна.NET Framework 4.5.1, необходимо проверить фактическое значение DWORD с именем Release в реестре, а не только его существование.
Значение 378758 означает, что установлен.NET Framework 4.5.1, однако, как описано здесь, это значение равно 378675 в Windows 8.1.
Если вы ищете варианты с.net framework 4.0+ (и выше), включая
- .net 4.5
- .net 4.5.1
Вы также можете проверить этот плагин для NSIS: DotNetChecker