2009-09-18 129 views
14

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

+0

ええと、私もこれに興味があります! –

+0

[NSIS wiki](http://nsis.sourceforge.net/Main_Page)にいくつかの例があります。 [this one](http://nsis.sourceforge.net/DotNET)を試してください。 –

+0

インストールされているバージョンを確認する方法は次のとおりです。http://forums.winamp.com/showthread.php?t=324928 – dastanko

答えて

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 
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 

はあなたが.onInit機能のどこかにCheckDotNetを呼び出す必要があり、仕事とことを確認しますdotnetfx35.exeは、$EXEDIRのインストーラにパックされています(もちろん、 eパラメータを使用してください)。ネットの他のバージョンの

、私は唯一異なる事がIfKeyExistsマクロパラメータで指定されたレジストリキーになると仮定し(今は{CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}ある)

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

その後、あなたは$0をチェックする必要があります。それはあなた次第です。

+0

これは他の回答と比較してどのような点が追加されていると思いますか?それは何をすべきか、それをインストールするのには向いていません。 –

3

私が(4.0 for .NETは、フルインストールし、あなたがsomwhere見つけることができる「DotNET.nsh」pluging、との問題があった し、単にこのソリューションを使用する - あなたが同様にそれを制限することができ 、私は必要とされクライアントパッケージ):

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版ではなく)です。インストーラは必要な場合には をダウンロードします。また、NSISコードを必要としません。

+0

おそらくupvoteの正しい理由ではないかもしれませんが、このスクリプトコードはこれを行う他の例よりも私にとって理にかなっています。ありがとう。 –

7

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

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

あなたは、.NET Frameworkでのオプションを探しているなら4.0+(以上)

  • .NET 4.5
  • .NET 4.5.1

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

関連する問題