Установщик NSIS, который проверяет .NET Framework
Я хочу создать установщик NSIS, который проверяет .NET Framework и устанавливает его, если он не существует. Можете ли вы указать мне на script для этого? Я очень новичок в NSIS.
Ответы
Ответ 1
Попробуйте DotNetVer script. Он использует LogicLib и довольно прост в использовании.
- HasDotNet <version> проверяет, установлена ли определенная версия платформы .NET. < & версии GT; могут быть заменены следующими значениями: 1.0, 1.1, 2.0, 3.0, 3.5, 4.0.
- AtLeastDotNetServicePack проверяет, имеет ли платформа .NET версию пакета обновления, по крайней мере, как указано.
- IsDotNetServicePack проверяет, имеет ли платформа .NET версию пакета обновления точно так, как указано.
- HasDotNetClientProfile проверяет, является ли .NET framework клиентской установкой.
- HasDotNetFullProfile проверяет, полностью ли установлена платформа .NET.
Пример:
${If} ${HasDotNet4.0}
DetailPrint "Microsoft .NET Framework 4.0 installed."
${If} ${DOTNETVER_4_0} AtLeastDotNetServicePack 1
DetailPrint "Microsoft .NET Framework 4.0 is at least SP1."
${Else}
DetailPrint "Microsoft .NET Framework 4.0 SP1 not installed."
${EndIf}
${If} ${DOTNETVER_4_0} HasDotNetClientProfile 1
DetailPrint "Microsoft .NET Framework 4.0 (Client Profile) available."
${EndIf}
${If} ${DOTNETVER_4_0} HasDotNetFullProfile 1
DetailPrint "Microsoft .NET Framework 4.0 (Full Profile) available."
${EndIf}
${If} ${DOTNETVER_4_0} HasDotNetFullProfile 0
DetailPrint "Microsoft .NET Framework 4.0 (Full Profile) not available."
${EndIf}
${EndIf}
Ответ 2
У меня возникла проблема с подключением "DotNET.nsh", который вы можете найти где-то,
и просто использовал это решение (для .NET 4.0, полная установка - что мне было нужно,
вы можете также ограничить его клиентским пакетом):
ClearErrors
ReadRegDWORD $0 HKLM "Software\Microsoft\Net Framework Setup\NDP\v4\Full" "Install"
IfErrors dotNet40NotFound
IntCmp $0 1 dotNet40Found
dotNet40NotFound:
Banner::show /set 76 "Installing .NET Framework 4.0" "Please wait"
File /nonfatal "tools\dotNetFx40_Full_setup.exe"
; if you don't have $TEMP already, add here:
; SetOutPath $TEMP
ExecWait "$TEMP\dotNetFx40_Full_setup.exe /passive /norestart"
Delete /REBOOTOK "$TEMP\dotNetFx40_Full_setup.exe"
Banner::destroy
dotNet40Found:
Содержимое баннера необязательно, вы можете просто использовать DetailPrint
или тому подобное.
Таким образом, вы тянете веб-установщик для .NET 4.0, но он довольно маленький
(в отличие от версий .NET, у которых их нет). Установщик выполняет загрузку
если это необходимо, и вам не нужны километры кода NSIS.
Ответ 3
!define DOT_MAJOR "2"
!define DOT_MINOR "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:
;Nope, something went wrong along the way. Looks like the proper .NETFramework isn't installed.
Push "NOK"
Return
yesDotNet:
;Everything checks out. Go on with the rest of the installation.
Push "OK"
Return
FunctionEnd
Ответ 4
Следующий код проверяет, установлен ли .Net 3.5, а если нет, он будет устанавливать его молча. Он использует макрос, который проверяет наличие указанного ключа в реестре.
Макрос:
# This macro checks if a certain key exists in the registry
!macro IfKeyExists ROOT MAIN_KEY KEY
push $R0
push $R1
!define Index 'Line${__LINE__}'
StrCpy $R1 "0"
"${Index}-Loop:"
; Check for Key
EnumRegKey $R0 ${ROOT} "${MAIN_KEY}" "$R1"
StrCmp $R0 "" "${Index}-False"
IntOp $R1 $R1 + 1
StrCmp $R0 "${KEY}" "${Index}-True" "${Index}-Loop"
"${Index}-True:"
;Return 1 if found
push "1"
goto "${Index}-End"
"${Index}-False:"
;Return 0 if not found
push "0"
goto "${Index}-End"
"${Index}-End:"
!undef Index
exch 2
pop $R0
pop $R1
!macroend
Функция:
# The function that checks if .net is already installed
Function CheckDotNet
!insertmacro IfKeyExists HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "{CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}"
Pop $R0
${If} $R0 == 0 # not installed NOTE: /q:a means this will be a silent installation
ExecWait "$EXEDIR\dotnetfx35.exe /q:a"
Goto endPrerequisites
${EndIf}
endPrerequisites:
# Code to execute after checking/installing (if necessary) .Net
# You can just put "Goto +2" here, in order to go to the next section/function
FunctionEnd
Чтобы это работало, вы должны вызвать CheckDotNet
где-нибудь в функции .onInit
и убедиться, что dotnetfx35.exe
упакован в ваш установщик в $EXEDIR
(конечно, вы можете изменить эти параметры, как вы пожелаете).
Для других версий .Net я полагаю, что единственным разделом будет раздел реестра, указанный в параметре IfKeyExists
(теперь это {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}
)
Ответ 5
Если вы ищете параметры с .net framework 4.0+ (и выше), включая
проверить этот плагин для NSIS: DotNetChecker
Ответ 6
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Install
Затем вы должны проверить $0
. Это зависит от вас.