DotNET: Difference between revisions
From NSIS Wiki
Jump to navigationJump to search
m (Reverted edits by 221.218.140.10 to last version by 193.138.244.218) |
|||
Line 1: | Line 1: | ||
== 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 == | == Usage == |
Revision as of 17:43, 24 January 2008
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:
!include "DotNET.nsh"
DotNet.nsh uses the ${if} function of LogicLib, so you also have to include it in your script:
!include LogicLib.nsh
Required Variables
Define the variable DOTNET_VERSION as the full or partial version of .NET Framework your app requires, like so:
!define DOTNET_VERSION "2.0.50727"
or
!define DOTNET_VERSION "2.0.5"
or
!define DOTNET_VERSION "2"
Using the Script
Insert the macro CheckDotNET into your script inside the first required section of the installer:
Section "Main Section (Required)" SectionIn RO !insertmacro CheckDotNET ${DOTNET_VERSION} #Files here SectionEnd
The Script
# 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
MSI Check Overview
Added check for MSI3. MSI check code based on [1]
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
# 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