|
|
Line 8: |
Line 8: |
|
| |
|
| <!-- keep the note above intact and put the page content right below --> | | <!-- keep the note above intact and put the page content right below --> |
|
| |
| == Overview ==
| |
| DotNET is a macro written to aid in the deployment of .NET Framework 2.0-based applications using NSIS.
| |
|
| |
| === What it does ===
| |
| # Checks the version of the .NET framework on the end-user's computer.
| |
| # Prompts them with a yes/no dialog if their version is different than the defined DOTNET_VERSION in the installer's main script.
| |
| # If they press yes, the installer downloads the latest .NET Framework 2.0 installer and runs it.
| |
|
| |
| === Limitations ===
| |
| * Only works for .NET Framework 2.0, not 1.0 or 1.1.
| |
|
| |
| == Usage ==
| |
| === Including the Script ===
| |
| Save the Script contents as DotNET.nsh in the same folder as your main script, and put line in your main script like this:
| |
| <highlight-nsis>!include "DotNET.nsh"</highlight-nsis>
| |
|
| |
| DotNet.nsh uses the ${if} function of LogicLib, so you also have to include it in your script:
| |
| <highlight-nsis>!include LogicLib.nsh</highlight-nsis>
| |
|
| |
| === Required Variables ===
| |
| Define the variable DOTNET_VERSION as the full or partial version of .NET Framework your app requires, like so:
| |
| <highlight-nsis>!define DOTNET_VERSION "2.0.50727"</highlight-nsis>
| |
| or
| |
| <highlight-nsis>!define DOTNET_VERSION "2.0.5"</highlight-nsis>
| |
| or
| |
| <highlight-nsis>!define DOTNET_VERSION "2"</highlight-nsis>
| |
|
| |
| === Using the Script ===
| |
| Insert the macro CheckDotNET into your script inside the first required section of the installer:
| |
| <highlight-nsis>
| |
| Section "Main Section (Required)"
| |
| SectionIn RO
| |
|
| |
| !insertmacro CheckDotNET ${DOTNET_VERSION}
| |
|
| |
| #Files here
| |
| SectionEnd
| |
| </highlight-nsis>
| |
|
| |
| == The Script ==
| |
| <div style="overflow: auto; width=100%;">
| |
| <highlight-nsis>
| |
| # DotNET version checking macro.
| |
| # Written by AnarkiNet(AnarkiNet@gmail.com) originally, modified by eyal0 (for use in http://www.sourceforge.net/projects/itwister)
| |
| # Downloads and runs the Microsoft .NET Framework version 2.0 Redistributable and runs it if the user does not have the correct version.
| |
| # To use, call the macro with a string:
| |
| # !insertmacro CheckDotNET "2"
| |
| # !insertmacro CheckDotNET "2.0.9"
| |
| # (Version 2.0.9 is less than version 2.0.10.)
| |
| # All register variables are saved and restored by CheckDotNet
| |
| # No output
| |
|
| |
| !macro CheckDotNET DotNetReqVer
| |
| !define DOTNET_URL "http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=0856eacb-4362-4b0d-8edd-aab15c5e04f5&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f5%2f6%2f7%2f567758a3-759e-473e-bf8f-52154438565a%2fdotnetfx.exe"
| |
| DetailPrint "Checking your .NET Framework version..."
| |
| ;callee register save
| |
| Push $0
| |
| Push $1
| |
| Push $2
| |
| Push $3
| |
| Push $4
| |
| Push $5
| |
| Push $6 ;backup of intsalled ver
| |
| Push $7 ;backup of DoNetReqVer
| |
|
| |
| StrCpy $7 ${DotNetReqVer}
| |
|
| |
| System::Call "mscoree::GetCORVersion(w .r0, i ${NSIS_MAX_STRLEN}, *i r2r2) i .r1 ?u"
| |
|
| |
| ${If} $0 == 0
| |
| DetailPrint ".NET Framework not found, download is required for program to run."
| |
| Goto NoDotNET
| |
| ${EndIf}
| |
|
| |
| ;at this point, $0 has maybe v2.345.678.
| |
| StrCpy $0 $0 $2 1 ;remove the starting "v", $0 has the installed version num as a string
| |
| StrCpy $6 $0
| |
| StrCpy $1 $7 ;$1 has the requested verison num as a string
| |
|
| |
| ;MessageBox MB_OKCANCEL "found $0" IDCANCEL GiveUpDotNET
| |
|
| |
| ;MessageBox MB_OKCANCEL "looking for $1" IDCANCEL GiveUpDotNET
| |
|
| |
| ;now let's compare the versions, installed against required <part0>.<part1>.<part2>.
| |
| ${Do}
| |
| StrCpy $2 "" ;clear out the installed part
| |
| StrCpy $3 "" ;clear out the required part
| |
|
| |
| ${Do}
| |
| ${If} $0 == "" ;if there are no more characters in the version
| |
| StrCpy $4 "." ;fake the end of the version string
| |
| ${Else}
| |
| StrCpy $4 $0 1 0 ;$4 = character from the installed ver
| |
| ${If} $4 != "."
| |
| StrCpy $0 $0 ${NSIS_MAX_STRLEN} 1 ;remove that first character from the remaining
| |
| ${EndIf}
| |
| ${EndIf}
| |
|
| |
| ${If} $1 == "" ;if there are no more characters in the version
| |
| StrCpy $5 "." ;fake the end of the version string
| |
| ${Else}
| |
| StrCpy $5 $1 1 0 ;$5 = character from the required ver
| |
| ${If} $5 != "."
| |
| StrCpy $1 $1 ${NSIS_MAX_STRLEN} 1 ;remove that first character from the remaining
| |
| ${EndIf}
| |
| ${EndIf}
| |
| ;MessageBox MB_OKCANCEL "installed $2,$4,$0 required $3,$5,$1" IDCANCEL GiveUpDotNET
| |
| ${If} $4 == "."
| |
| ${AndIf} $5 == "."
| |
| ${ExitDo} ;we're at the end of the part
| |
| ${EndIf}
| |
|
| |
| ${If} $4 == "." ;if we're at the end of the current installed part
| |
| StrCpy $2 "0$2" ;put a zero on the front
| |
| ${Else} ;we have another character
| |
| StrCpy $2 "$2$4" ;put the next character on the back
| |
| ${EndIf}
| |
| ${If} $5 == "." ;if we're at the end of the current required part
| |
| StrCpy $3 "0$3" ;put a zero on the front
| |
| ${Else} ;we have another character
| |
| StrCpy $3 "$3$5" ;put the next character on the back
| |
| ${EndIf}
| |
| ${Loop}
| |
| ;MessageBox MB_OKCANCEL "finished parts: installed $2,$4,$0 required $3,$5,$1" IDCANCEL GiveUpDotNET
| |
|
| |
| ${If} $0 != "" ;let's remove the leading period on installed part if it exists
| |
| StrCpy $0 $0 ${NSIS_MAX_STRLEN} 1
| |
| ${EndIf}
| |
| ${If} $1 != "" ;let's remove the leading period on required part if it exists
| |
| StrCpy $1 $1 ${NSIS_MAX_STRLEN} 1
| |
| ${EndIf}
| |
|
| |
| ;$2 has the installed part, $3 has the required part
| |
| ${If} $2 S< $3
| |
| IntOp $0 0 - 1 ;$0 = -1, installed less than required
| |
| ${ExitDo}
| |
| ${ElseIf} $2 S> $3
| |
| IntOp $0 0 + 1 ;$0 = 1, installed greater than required
| |
| ${ExitDo}
| |
| ${ElseIf} $2 == ""
| |
| ${AndIf} $3 == ""
| |
| IntOp $0 0 + 0 ;$0 = 0, the versions are identical
| |
| ${ExitDo}
| |
| ${EndIf} ;otherwise we just keep looping through the parts
| |
| ${Loop}
| |
|
| |
| ${If} $0 < 0
| |
| DetailPrint ".NET Framework Version found: $6, but is older than the required version: $7"
| |
| Goto OldDotNET
| |
| ${Else}
| |
| DetailPrint ".NET Framework Version found: $6, equal or newer to required version: $7."
| |
| Goto NewDotNET
| |
| ${EndIf}
| |
|
| |
| NoDotNET:
| |
| MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \
| |
| ".NET Framework not installed.$\nRequired Version: $7 or greater.$\nDownload .NET Framework version from www.microsoft.com?" \
| |
| /SD IDYES IDYES DownloadDotNET IDNO NewDotNET
| |
| goto GiveUpDotNET ;IDCANCEL
| |
| OldDotNET:
| |
| MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \
| |
| "Your .NET Framework version: $6.$\nRequired Version: $7 or greater.$\nDownload .NET Framework version from www.microsoft.com?" \
| |
| /SD IDYES IDYES DownloadDotNET IDNO NewDotNET
| |
| goto GiveUpDotNET ;IDCANCEL
| |
|
| |
| DownloadDotNET:
| |
| DetailPrint "Beginning download of latest .NET Framework version."
| |
| NSISDL::download ${DOTNET_URL} "$TEMP\dotnetfx.exe"
| |
| DetailPrint "Completed download."
| |
| Pop $0
| |
| ${If} $0 == "cancel"
| |
| MessageBox MB_YESNO|MB_ICONEXCLAMATION \
| |
| "Download cancelled. Continue Installation?" \
| |
| IDYES NewDotNET IDNO GiveUpDotNET
| |
| ${ElseIf} $0 != "success"
| |
| MessageBox MB_YESNO|MB_ICONEXCLAMATION \
| |
| "Download failed:$\n$0$\n$\nContinue Installation?" \
| |
| IDYES NewDotNET IDNO GiveUpDotNET
| |
| ${EndIf}
| |
| DetailPrint "Pausing installation while downloaded .NET Framework installer runs."
| |
| ExecWait '$TEMP\dotnetfx.exe /q /c:"install /q"'
| |
| DetailPrint "Completed .NET Framework install/update. Removing .NET Framework installer."
| |
| Delete "$TEMP\dotnetfx.exe"
| |
| DetailPrint ".NET Framework installer removed."
| |
| goto NewDotNet
| |
|
| |
| GiveUpDotNET:
| |
| Abort "Installation cancelled by user."
| |
|
| |
| NewDotNET:
| |
| DetailPrint "Proceeding with remainder of installation."
| |
| Pop $0
| |
| Pop $1
| |
| Pop $2
| |
| Pop $3
| |
| Pop $4
| |
| Pop $5
| |
| Pop $6 ;backup of intsalled ver
| |
| Pop $7 ;backup of DoNetReqVer
| |
| !macroend
| |
| </highlight-nsis></div>
| |
|
| |
|
| |
| == Overview ==
| |
| Added check for MSI3.
| |
|
| |
| === What it does ===
| |
| # Checks the version of the MSI on the end-user's computer.
| |
| # Prompts them with a yes/no dialog if their version is lower than 3.
| |
| # If they press yes, the installer downloads the latest MSI3.1 installer and runs it.
| |
| # Checks the version of the .NET framework on the end-user's computer.
| |
| # Prompts them with a yes/no dialog if their version is different than the defined DOTNET_VERSION in the installer's main script.
| |
| # If they press yes, the installer downloads the latest .NET Framework 2.0 installer and runs it.
| |
|
| |
| == The Script With MSI Check ==
| |
| <div style="overflow: auto; width=100%;">
| |
| <highlight-nsis>
| |
| # DotNET and MSI version checking macro.
| |
| # Written by AnarkiNet(AnarkiNet@gmail.com) originally, modified by eyal0 (for use in http://www.sourceforge.net/projects/itwister)
| |
| # MSI check code based on http://www.codeproject.com/useritems/NSIS.asp
| |
| # Downloads the MSI version 3.1 and runs it if the user does not have the correct version.
| |
| # Downloads and runs the Microsoft .NET Framework version 2.0 Redistributable and runs it if the user does not have the correct version.
| |
| # To use, call the macro with a string:
| |
| # !insertmacro CheckDotNET "2"
| |
| # !insertmacro CheckDotNET "2.0.9"
| |
| # (Version 2.0.9 is less than version 2.0.10.)
| |
| # All register variables are saved and restored by CheckDotNet
| |
| # No output
| |
|
| |
| !macro CheckDotNET DotNetReqVer
| |
| !define DOTNET_URL "http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=0856eacb-4362-4b0d-8edd-aab15c5e04f5&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f5%2f6%2f7%2f567758a3-759e-473e-bf8f-52154438565a%2fdotnetfx.exe"
| |
| !define MSI31_URL "http://download.microsoft.com/download/1/4/7/147ded26-931c-4daf-9095-ec7baf996f46/WindowsInstaller-KB893803-v2-x86.exe"
| |
|
| |
| DetailPrint "Checking your .NET Framework version..."
| |
| ;callee register save
| |
| Push $0
| |
| Push $1
| |
| Push $2
| |
| Push $3
| |
| Push $4
| |
| Push $5
| |
| Push $6 ;backup of intsalled ver
| |
| Push $7 ;backup of DoNetReqVer
| |
|
| |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
| |
| ; MSI ;
| |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
| |
| GetDLLVersion "$SYSDIR\msi.dll" $R0 $R1
| |
| IntOp $R2 $R0 / 0x00010000 ; $R2 now contains major version
| |
| IntOp $R3 $R0 & 0x0000FFFF ; $R3 now contains minor version
| |
| IntOp $R4 $R1 / 0x00010000 ; $R4 now contains release
| |
| IntOp $R5 $R1 & 0x0000FFFF ; $R5 now contains build
| |
| StrCpy $0 "$R2.$R3.$R4.$R5" ; $0 now contains string like "1.2.0.192"
| |
|
| |
| ${If} $R2 < '3'
| |
| ;options
| |
| SetOutPath "$TEMP"
| |
| SetOverwrite on
| |
|
| |
| MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \
| |
| "Your MSI version: $0.$\nRequired Version: 3 or greater.$\nDownload MSI version from www.microsoft.com?" \
| |
| /SD IDYES IDYES DownloadMSI IDNO NewMSI
| |
| goto GiveUpDotNET ;IDCANCEL
| |
|
| |
| ${Else}
| |
|
| |
| DetailPrint "MSI3.1 already installed"
| |
| goto NewMSI
| |
| ${EndIf}
| |
|
| |
| DownloadMSI:
| |
| DetailPrint "Beginning download of MSI3.1."
| |
| NSISDL::download ${MSI31_URL} "$TEMP\WindowsInstaller-KB893803-v2-x86.exe"
| |
| DetailPrint "Completed download."
| |
| Pop $0
| |
| ${If} $0 == "cancel"
| |
| MessageBox MB_YESNO|MB_ICONEXCLAMATION \
| |
| "Download cancelled. Continue Installation?" \
| |
| IDYES NewMSI IDNO GiveUpDotNET
| |
| ${ElseIf} $0 != "success"
| |
| MessageBox MB_YESNO|MB_ICONEXCLAMATION \
| |
| "Download failed:$\n$0$\n$\nContinue Installation?" \
| |
| IDYES NewMSI IDNO GiveUpDotNET
| |
| ${EndIf}
| |
| DetailPrint "Pausing installation while downloaded MSI3.1 installer runs."
| |
| ExecWait '$TEMP\WindowsInstaller-KB893803-v2-x86.exe /quiet /norestart' $0
| |
| DetailPrint "Completed MSI3.1 install/update. Exit code = '$0'. Removing MSI3.1 installer."
| |
| Delete "$TEMP\WindowsInstaller-KB893803-v2-x86.exe"
| |
| DetailPrint "MSI3.1 installer removed."
| |
| goto NewMSI
| |
|
| |
| NewMSI:
| |
| DetailPrint "MSI3.1 installation done. Proceeding with remainder of installation."
| |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
| |
|
| |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
| |
| ; NetFX ;
| |
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
| |
| StrCpy $7 ${DotNetReqVer}
| |
|
| |
| System::Call "mscoree::GetCORVersion(w .r0, i ${NSIS_MAX_STRLEN}, *i r2r2) i .r1 ?u"
| |
|
| |
| ${If} $0 == 0
| |
| DetailPrint ".NET Framework not found, download is required for program to run."
| |
| Goto NoDotNET
| |
| ${EndIf}
| |
|
| |
| ;at this point, $0 has maybe v2.345.678.
| |
| StrCpy $0 $0 $2 1 ;remove the starting "v", $0 has the installed version num as a string
| |
| StrCpy $6 $0
| |
| StrCpy $1 $7 ;$1 has the requested verison num as a string
| |
|
| |
| ;MessageBox MB_OKCANCEL "found $0" IDCANCEL GiveUpDotNET
| |
|
| |
| ;MessageBox MB_OKCANCEL "looking for $1" IDCANCEL GiveUpDotNET
| |
|
| |
| ;now let's compare the versions, installed against required <part0>.<part1>.<part2>.
| |
| ${Do}
| |
| StrCpy $2 "" ;clear out the installed part
| |
| StrCpy $3 "" ;clear out the required part
| |
|
| |
| ${Do}
| |
| ${If} $0 == "" ;if there are no more characters in the version
| |
| StrCpy $4 "." ;fake the end of the version string
| |
| ${Else}
| |
| StrCpy $4 $0 1 0 ;$4 = character from the installed ver
| |
| ${If} $4 != "."
| |
| StrCpy $0 $0 ${NSIS_MAX_STRLEN} 1 ;remove that first character from the remaining
| |
| ${EndIf}
| |
| ${EndIf}
| |
|
| |
| ${If} $1 == "" ;if there are no more characters in the version
| |
| StrCpy $5 "." ;fake the end of the version string
| |
| ${Else}
| |
| StrCpy $5 $1 1 0 ;$5 = character from the required ver
| |
| ${If} $5 != "."
| |
| StrCpy $1 $1 ${NSIS_MAX_STRLEN} 1 ;remove that first character from the remaining
| |
| ${EndIf}
| |
| ${EndIf}
| |
| ;MessageBox MB_OKCANCEL "installed $2,$4,$0 required $3,$5,$1" IDCANCEL GiveUpDotNET
| |
| ${If} $4 == "."
| |
| ${AndIf} $5 == "."
| |
| ${ExitDo} ;we're at the end of the part
| |
| ${EndIf}
| |
|
| |
| ${If} $4 == "." ;if we're at the end of the current installed part
| |
| StrCpy $2 "0$2" ;put a zero on the front
| |
| ${Else} ;we have another character
| |
| StrCpy $2 "$2$4" ;put the next character on the back
| |
| ${EndIf}
| |
| ${If} $5 == "." ;if we're at the end of the current required part
| |
| StrCpy $3 "0$3" ;put a zero on the front
| |
| ${Else} ;we have another character
| |
| StrCpy $3 "$3$5" ;put the next character on the back
| |
| ${EndIf}
| |
| ${Loop}
| |
| ;MessageBox MB_OKCANCEL "finished parts: installed $2,$4,$0 required $3,$5,$1" IDCANCEL GiveUpDotNET
| |
|
| |
| ${If} $0 != "" ;let's remove the leading period on installed part if it exists
| |
| StrCpy $0 $0 ${NSIS_MAX_STRLEN} 1
| |
| ${EndIf}
| |
| ${If} $1 != "" ;let's remove the leading period on required part if it exists
| |
| StrCpy $1 $1 ${NSIS_MAX_STRLEN} 1
| |
| ${EndIf}
| |
|
| |
| ;$2 has the installed part, $3 has the required part
| |
| ${If} $2 S< $3
| |
| IntOp $0 0 - 1 ;$0 = -1, installed less than required
| |
| ${ExitDo}
| |
| ${ElseIf} $2 S> $3
| |
| IntOp $0 0 + 1 ;$0 = 1, installed greater than required
| |
| ${ExitDo}
| |
| ${ElseIf} $2 == ""
| |
| ${AndIf} $3 == ""
| |
| IntOp $0 0 + 0 ;$0 = 0, the versions are identical
| |
| ${ExitDo}
| |
| ${EndIf} ;otherwise we just keep looping through the parts
| |
| ${Loop}
| |
|
| |
| ${If} $0 < 0
| |
| DetailPrint ".NET Framework Version found: $6, but is older than the required version: $7"
| |
| Goto OldDotNET
| |
| ${Else}
| |
| DetailPrint ".NET Framework Version found: $6, equal or newer to required version: $7."
| |
| Goto NewDotNET
| |
| ${EndIf}
| |
|
| |
| NoDotNET:
| |
| MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \
| |
| ".NET Framework not installed.$\nRequired Version: $7 or greater.$\nDownload .NET Framework version from www.microsoft.com?" \
| |
| /SD IDYES IDYES DownloadDotNET IDNO NewDotNET
| |
| goto GiveUpDotNET ;IDCANCEL
| |
| OldDotNET:
| |
| MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \
| |
| "Your .NET Framework version: $6.$\nRequired Version: $7 or greater.$\nDownload .NET Framework version from www.microsoft.com?" \
| |
| /SD IDYES IDYES DownloadDotNET IDNO NewDotNET
| |
| goto GiveUpDotNET ;IDCANCEL
| |
|
| |
| DownloadDotNET:
| |
| DetailPrint "Beginning download of latest .NET Framework version."
| |
| NSISDL::download ${DOTNET_URL} "$TEMP\dotnetfx.exe"
| |
| DetailPrint "Completed download."
| |
| Pop $0
| |
| ${If} $0 == "cancel"
| |
| MessageBox MB_YESNO|MB_ICONEXCLAMATION \
| |
| "Download cancelled. Continue Installation?" \
| |
| IDYES NewDotNET IDNO GiveUpDotNET
| |
| ${ElseIf} $0 != "success"
| |
| MessageBox MB_YESNO|MB_ICONEXCLAMATION \
| |
| "Download failed:$\n$0$\n$\nContinue Installation?" \
| |
| IDYES NewDotNET IDNO GiveUpDotNET
| |
| ${EndIf}
| |
| DetailPrint "Pausing installation while downloaded .NET Framework installer runs."
| |
| ExecWait '$TEMP\dotnetfx.exe /q /c:"install /q"'
| |
| DetailPrint "Completed .NET Framework install/update. Removing .NET Framework installer."
| |
| Delete "$TEMP\dotnetfx.exe"
| |
| DetailPrint ".NET Framework installer removed."
| |
| goto NewDotNet
| |
|
| |
| GiveUpDotNET:
| |
| Abort "Installation cancelled by user."
| |
|
| |
| NewDotNET:
| |
| DetailPrint "Proceeding with remainder of installation."
| |
| Pop $0
| |
| Pop $1
| |
| Pop $2
| |
| Pop $3
| |
| Pop $4
| |
| Pop $5
| |
| Pop $6 ;backup of intsalled ver
| |
| Pop $7 ;backup of DoNetReqVer
| |
| !macroend
| |
| </highlight-nsis></div>
| |
|
| |
|
| |
| [[Category:Other Products Handling Functions]]
| |
| [[Category:Other Products Version Detection Functions]]
| |
| [[Category:Internet Functions]]
| |