Проверьте .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 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 equal check the minor version, if it greater,
; we found a good RegKey.
IntCmp $4 ${DOT_MAJOR} +1 goNext yesDotNetReg
; Check the minor version. If it 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 make sure it 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 .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. Теперь я видел следующие сообщения:
NSIS Installer с .NET 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 и ниже.
Ответы
Ответ 1
Да, есть официальный способ проверить, установлена ли .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.
http://msdn.microsoft.com/en-us/library/hh925568.aspx
Это означает, что вам сначала нужно проверить, установлен ли 4.0, а затем проверить, есть ли значение с именем Release
в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full
, если тогда 4.5 уже установлено (я думаю, вы можете пропустить чек для pre -реализованная версия).
РЕДАКТИРОВАТЬ: проверьте этот пост здесь, на SO, для получения подробной информации об обнаружении старых установленных версий .NET и статья MSDN, чтобы различать для версий 4.5.x.
Ответ 2
Вот функция, которую я написал, которая проверяет и загружает, если требуется,.NET 4.5. Кроме того, код также ищет локальную копию установщика .NET - в случае, если вы должны были установить ваш установщик на CD или USB-накопитель или что-то в этом роде. Поддерживает установку Silent и Non-Silent, а также установку флага Reboot. Функция является автономной, но ожидает, что вы включите LogicLib (который включен в базовую установку NSIS).
Это код, который я написал для того, что будет установщиком для моих книг Rachel Story.
Function CheckAndDownloadDotNet45
# Let 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 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 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 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 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 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
Ответ 3
В конце я пошел со следующей функцией, которая использует ответ выше. Этот метод сначала создает каталог "$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 .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
Этот метод seemlessley запускает установщик .NET4.5, если есть подключение к Интернету и возвращается после завершения установки.
Я надеюсь, что это поможет кому-то другому.
Ответ 4
Вот простая функция 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
Ответ 5
Теперь, когда доступна .NET Framework 4.5.1, фактическое значение DWORD с именем Release в реестре должно быть проверено, а не только его существование.
Значение 378758 означает, что .NET Framework 4.5.1 установлен, однако, как описано здесь это значение 378675 в Windows 8.1.
Ответ 6
Если вы ищете параметры с .net framework 4.0+ (и выше), включая
вы также можете проверить этот плагин для NSIS: DotNetChecker