Я хочу создать установщик NSIS, который проверяет наличие .NET Framework и устанавливает его, если его там нет. Вы можете указать мне сценарий для этого? Я новичок в NSIS.
Установщик NSIS, проверяющий .NET Framework
Ответы (5)
Попробуйте сценарий DotNetVer. Он использует LogicLib и довольно прост в использовании.
- HasDotNet ‹version› проверяет, установлена ли конкретная версия .NET framework. ‹Version› можно заменить следующими значениями: 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}
У меня возникла проблема с подключением "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.
Следующий код проверяет, установлен ли .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
macro (теперь это {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}
)
Если вы ищете варианты с .net framework 4.0+ (и выше), включая
- .net 4.5
- .net 4.5.1
проверьте этот плагин для NSIS: DotNetChecker
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Install
Тогда вы должны проверить $0
. Вам решать, как это сделать.