Установщик NSIS, проверяющий .NET Framework

Я хочу создать установщик NSIS, который проверяет наличие .NET Framework и устанавливает его, если его там нет. Вы можете указать мне сценарий для этого? Я новичок в NSIS.


person omgwtfbbq    schedule 18.09.2009    source источник
comment
Хм, меня это тоже интересует!   -  person Maxim Zaslavsky    schedule 18.09.2009
comment
В NSIS wiki есть несколько примеров. Попробуйте этот.   -  person Travis Beale    schedule 19.09.2009
comment
Вы не упоминаете, какая версия .Net, но альтернативным решением была бы установка ее в автоматическом режиме. ‹A href=blogs.msdn.com/brada/archive/2007/06/26/ установка .NET Framework ‹/a›‹ a href = msdn.microsoft.com/en-us/library/ .NET Framework 2.0 ‹/a› Вот как я работаю с vcredist_x86.exe (т.е. просто всегда устанавливайте без вывода сообщений)   -  person crashmstr    schedule 19.09.2009
comment
Вот способ проверить, какая версия установлена, попробуйте forum.winamp.com/showthread. php? t = 324928   -  person dastanko    schedule 20.12.2010


Ответы (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}
person Spiralis    schedule 26.04.2012

У меня возникла проблема с подключением "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.

person Tomasz Gandor    schedule 17.04.2012
comment
Вероятно, это не правильная причина для голосования за, но этот код сценария имел для меня больше смысла, чем любые другие примеры этого. Спасибо. - person Craig Brett; 24.07.2013

Следующий код проверяет, установлен ли .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, я полагаю, единственным отличием будет ключ реестра, указанный в параметре IfKeyExistsmacro (теперь это {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9})

person adritha84    schedule 16.08.2011

Если вы ищете варианты с .net framework 4.0+ (и выше), включая

  • .net 4.5
  • .net 4.5.1

проверьте этот плагин для NSIS: DotNetChecker

person Mehrad    schedule 07.10.2014

ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Install

Тогда вы должны проверить $0. Вам решать, как это сделать.

person Paval    schedule 16.12.2011
comment
Как вы считаете, что это добавляет по сравнению с другими ответами? Он не говорит, что он должен быть, и не собирается его устанавливать. - person Chris Morgan; 16.12.2011