Все, мне известно о следующих методах проверки версии фреймворка в 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. Теперь я видел следующие сообщения:
который использует путь/запись реестра "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 и ниже.