14

.NET Frameworkをチェックし、存在しない場合はインストールするNSISインストーラーを作成したいと思います。このためのスクリプトを教えてもらえますか?私はNSISにとても慣れていません。

4

6 に答える 6

7

DotNetVerスクリプトを試してください。LogicLibを使用しており、非常に使いやすいです。

  • HasDotNet<version>は、特定のバージョンの .NET フレームワークがインストールされているかどうかを確認します。<version> は、1.0、1.1、2.0、3.0、3.5、4.0 の値に置き換えることができます。
  • AtLeastDotNetServicePackは、少なくとも指定されたサービス パック バージョンが .NET フレームワークにあるかどうかをチェックします。
  • IsDotNetServicePackは、.NET フレームワークに指定されたサービス パック バージョンがあるかどうかを確認します。
  • HasDotNetClientProfileは、.NET フレームワークがクラ​​イアント プロファイル インストールであるかどうかを確認します。
  • HasDotNetFullProfileは、.NET フレームワークが完全にインストールされているかどうかを確認します。

サンプル:

${If} ${HasDotNet4.0}
    DetailPrint "Microsoft .NET Framework 4.0 がインストールされています。"
    ${If} ${DOTNETVER_4_0} AtLeastDotNetServicePack 1
        DetailPrint "Microsoft .NET Framework 4.0 は少なくとも SP1 です。"
    ${その他}
        DetailPrint "Microsoft .NET Framework 4.0 SP1 がインストールされていません。"
    ${EndIf}
    ${If} ${DOTNETVER_4_0} HasDotNetClientProfile 1
        DetailPrint "Microsoft .NET Framework 4.0 (クライアント プロファイル) が利用可能です。"
    ${EndIf}
    ${If} ${DOTNETVER_4_0} HasDotNetFullProfile 1
        DetailPrint "Microsoft .NET Framework 4.0 (フル プロファイル) が利用可能です。"
    ${EndIf}
    ${If} ${DOTNETVER_4_0} HasDotNetFullProfile 0
        DetailPrint "Microsoft .NET Framework 4.0 (フル プロファイル) は利用できません。"
    ${EndIf}
${EndIf}
于 2012-04-26T11:23:43.367 に答える
3

どこかで見つけることができる「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 用の Web インストーラーを取得しますが、これはかなり小さいものです (.NET のバージョンには 1 つもありませんでした)。必要に応じてインストーラーがダウンロードを行います。何キロにもわたる NSIS コードは必要ありません。

于 2012-04-17T13:21:56.447 に答える
2
!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's 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's equal check the minor version, if it's greater, 
      ;we found a good RegKey.
      IntCmp $4 ${DOT_MAJOR} +1 goNext yesDotNetReg
      ;Check the minor version.  If it's 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's make sure it's 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
于 2010-05-04T18:17:51.113 に答える
0

次のコードは、.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}) 。

于 2011-08-16T12:41:06.853 に答える
0

.net フレームワーク 4.0+ (およびそれ以降) を含むオプションを探している場合

  • .net 4.5
  • .net 4.5.1

このプラグインで NSIS を確認してください: DotNetChecker

于 2014-10-07T01:48:30.493 に答える
-1
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Install

次に、を確認する必要があります$0。どのようにそれはあなた次第です。

于 2011-12-16T13:17:53.267 に答える