Следующий код проверяет, установлен ли .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}
)