Configuración de Inno: Verifique que .NET 4.0 esté instalado

Tengo un componente que requiere la ejecución de .NET 4.0, ¿cómo puede mi instalador de instalación de Inno verificar que esté instalado y, de no ser así, solicitar al usuario que lo instale?

La función InitializeSetup se invoca cuando se ejecuta el ejecutable Inno Setup. Al insertar este código para una secuencia de comandos personalizada debe hacer lo que desee:

 function IsDotNetDetected(version: string; service: cardinal): boolean; // Indicates whether the specified version and service pack of the .NET Framework is installed. // // version -- Specify one of these strings for the required .NET Framework version: // 'v1.1' .NET Framework 1.1 // 'v2.0' .NET Framework 2.0 // 'v3.0' .NET Framework 3.0 // 'v3.5' .NET Framework 3.5 // 'v4\Client' .NET Framework 4.0 Client Profile // 'v4\Full' .NET Framework 4.0 Full Installation // 'v4.5' .NET Framework 4.5 // 'v4.5.1' .NET Framework 4.5.1 // 'v4.5.2' .NET Framework 4.5.2 // 'v4.6' .NET Framework 4.6 // 'v4.6.1' .NET Framework 4.6.1 // 'v4.6.2' .NET Framework 4.6.2 // 'v4.7' .NET Framework 4.7 // // service -- Specify any non-negative integer for the required service pack level: // 0 No service packs required // 1, 2, etc. Service pack 1, 2, etc. required var key, versionKey: string; install, release, serviceCount, versionRelease: cardinal; success: boolean; begin versionKey := version; versionRelease := 0; // .NET 1.1 and 2.0 embed release number in version key if version = 'v1.1' then begin versionKey := 'v1.1.4322'; end else if version = 'v2.0' then begin versionKey := 'v2.0.50727'; end // .NET 4.5 and newer install as update to .NET 4.0 Full else if Pos('v4.', version) = 1 then begin versionKey := 'v4\Full'; case version of 'v4.5': versionRelease := 378389; 'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older 'v4.5.2': versionRelease := 379893; 'v4.6': versionRelease := 393295; // 393297 on Windows 8.1 and older 'v4.6.1': versionRelease := 394254; // 394271 before Win10 November Update 'v4.6.2': versionRelease := 394802; // 394806 before Win10 Anniversary Update 'v4.7': versionRelease := 460798; // 460805 before Win10 Creators Update end; end; // installation key group for all .NET versions key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey; // .NET 3.0 uses value InstallSuccess in subkey Setup if Pos('v3.0', version) = 1 then begin success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install); end else begin success := RegQueryDWordValue(HKLM, key, 'Install', install); end; // .NET 4.0 and newer use value Servicing instead of SP if Pos('v4', version) = 1 then begin success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount); end else begin success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount); end; // .NET 4.5 and newer use additional value Release if versionRelease > 0 then begin success := success and RegQueryDWordValue(HKLM, key, 'Release', release); success := success and (release >= versionRelease); end; result := success and (install = 1) and (serviceCount >= service); end; function InitializeSetup(): Boolean; begin if not IsDotNetDetected('v4.6', 0) then begin MsgBox('MyApp requires Microsoft .NET Framework 4.6.'#13#13 'Please use Windows Update to install this version,'#13 'and then re-run the MyApp setup program.', mbInformation, MB_OK); result := false; end else result := true; end; 

(Código tomado de aquí: http://www.kynosarges.de/DotNetVersion.html )

En primer lugar, comprueba la presencia de una entrada de registro que indica la versión de .NET Framework que está instalado. Si la entrada de registro no está presente, solicita al usuario descargar el .NET framework. Si el usuario dice Sí, abre la URL de descarga. (Puede que tenga que cambiar la versión que especifica en el script a la versión 4.0).

También me encontré con este artículo sobre CodeProject , que puede ser una forma más completa y personalizable de hacer lo que estás buscando, aunque puede que te cueste más trabajo comprender y deba modificarse para que funcione con la versión 4.0.

@Cody Gray – Gracias por su solución. ¡Muy útil!

En caso de que alguien esté interesado, aquí está mi opinión sobre su función usando valores de enumeración en lugar de cadenas. Este cambio es puramente una cuestión de preferencia personal. El código incluye los cambios para v4.5 y parece funcionar correctamente según mis pruebas limitadas.

David

 [Code] // // Enumeration used to specify a .NET framework version // type TDotNetFramework = ( DotNet_v11_4322, // .NET Framework 1.1 DotNet_v20_50727, // .NET Framework 2.0 DotNet_v30, // .NET Framework 3.0 DotNet_v35, // .NET Framework 3.5 DotNet_v4_Client, // .NET Framework 4.0 Client Profile DotNet_v4_Full, // .NET Framework 4.0 Full Installation DotNet_v45); // .NET Framework 4.5 // // Checks whether the specified .NET Framework version and service pack // is installed (See: http://www.kynosarges.de/DotNetVersion.html) // // Parameters: // Version - Required .NET Framework version // ServicePack - Required service pack level (0: None, 1: SP1, 2: SP2 etc.) // function IsDotNetInstalled(Version: TDotNetFramework; ServicePack: cardinal): boolean; var KeyName : string; Check45 : boolean; Success : boolean; InstallFlag : cardinal; ReleaseVer : cardinal; ServiceCount : cardinal; begin // Registry path for the requested .NET Version KeyName := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\'; case Version of DotNet_v11_4322: KeyName := KeyName + 'v1.1.4322'; DotNet_v20_50727: KeyName := KeyName + 'v2.0.50727'; DotNet_v30: KeyName := KeyName + 'v3.0'; DotNet_v35: KeyName := KeyName + 'v3.5'; DotNet_v4_Client: KeyName := KeyName + 'v4\Client'; DotNet_v4_Full: KeyName := KeyName + 'v4\Full'; DotNet_v45: KeyName := KeyName + 'v4\Full'; end; // .NET 3.0 uses "InstallSuccess" key in subkey Setup if (Version = DotNet_v30) then Success := RegQueryDWordValue(HKLM, KeyName + '\Setup', 'InstallSuccess', InstallFlag) else Success := RegQueryDWordValue(HKLM, KeyName, 'Install', InstallFlag); // .NET 4.0/4.5 uses "Servicing" key instead of "SP" if (Version = DotNet_v4_Client) or (Version = DotNet_v4_Full) or (Version = DotNet_v45) then Success := Success and RegQueryDWordValue(HKLM, KeyName, 'Servicing', ServiceCount) else Success := Success and RegQueryDWordValue(HKLM, KeyName, 'SP', ServiceCount); // .NET 4.5 is distinguished from .NET 4.0 by the Release key if (Version = DotNet_v45) then begin Success := Success and RegQueryDWordValue(HKLM, KeyName, 'Release', ReleaseVer); Success := Success and (ReleaseVer >= 378389); end; Result := Success and (InstallFlag = 1) and (ServiceCount >= ServicePack); end; 

Si no le importa si está instalada la versión “Completa” o simplemente la versión “Cliente” de .NET 4:

 try ExpandConstant('{dotnet40}'); // Installed except // Not installed end;