Tengo un componente que requiere .NET 4.0 para funcionar, ¿cómo puede verificar mi configuración de instalación Inno que está instalado, y si no, pedir al usuario que lo instale?Inno Setup: verificar que .NET 4.0 está instalado
Respuesta
La función InitializeSetup
se llama cuando se ejecuta el ejecutable de instalación Inno. Insertar el código de un script personalizado debe hacer lo que quiera:
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, se comprueba la presencia de una entrada de registro que indica la versión del. NET marco 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 especifica en el guión a la versión 4.0.)
También me encontré con this article on CodeProject, que puede ser una manera más completa y personalizada de hacer lo que está buscando, aunque puede tomar más trabajo para comprender y tendrá que modificarse para que funcione con la versión 4.0.
@Cody Gray - Gracias por su solución. ¡Muy útil!
En caso de que a alguien le interesa, aquí es mi opinión sobre su función con 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;
esto se ve muy bien, pero ¿también mostrarías cómo usar esto desde el parámetro de verificación? – vidriduch
Simplemente agregue esto justo después de la función anterior: 'function IsDotNetReallyInstalled(): Boolean; begin result: = IsDotNetInstalled (DotNet_v45, 0); final; ' Luego llama eso en tu función de 'verificación'. –
Excuse me ... Parámetro de comprobación: Agregar un 'no' ... no IsDotNetInstalled –
Si no le importa si se ha instalado el "completo" o simplemente la versión "Cliente" de .NET 4:
try
ExpandConstant('{dotnet40}');
// Installed
except
// Not installed
end;
- 1. Inno Setup Instalación y configuración de IIS
- 2. Inno Setup página personalizada
- 3. Verificar si Solidworks está instalado?
- 4. Cómo registrar una .NET DLL usando Inno Setup
- 5. Hook estándar Inno Setup checkbox
- 6. Inno Setup Comprobación del proceso en ejecución
- 7. ¿Inno Setup para el servicio de Windows?
- 8. ¿Cómo puedo hacer que Inno Setup ignore los directorios vacíos?
- 9. Inno Setup: ¿Cómo veo la salida (traducción) del preprocesador Inno Setup?
- 10. ¿Cómo puedo usar GetVolumeInformation en Inno Setup?
- 11. Script Inno Setup para copiar carpetas
- 12. Inno Setup uninstall executable location and name
- 13. Inno Setup - Setting Java Environment Variable
- 14. Constante Inno Setup en el Código Sección
- 15. Inno-setup 32bit y 64bit en uno
- 16. Salir de Inno Setup Instalación desde [código]
- 17. ¿Dónde está instalado microsoft.office.tools.excel.dll?
- 18. Inno Setup Renombrar archivo durante el embalaje
- 19. Crear un usuario restringido desde Inno Setup
- 20. ¿Es seguro instalar .Net 3.5 SP1 después de que .Net 4.0 RC ya haya sido instalado?
- 21. ¿Cómo verificar con inno-setup, si un proceso se está ejecutando en un windows 2008 r2 64bit?
- 22. Comprobar que Adobe Reader está instalado (C#)?
- 23. ¿Cuál usar, Visual Studio Installer o Inno Setup?
- 24. ¿Cómo se muestra un hipervínculo en Inno Setup?
- 25. ¿Cómo se hace para que Inno Setup no parezca congelado mientras se realiza un Exec largo?
- 26. Ejecutar otro instalador en una instalación de Inno Setup
- 27. Inno Setup: cómo definir una matriz en const?
- 28. Cómo obtener la dirección IP local usando Inno-setup
- 29. ¿Cómo puedo verificar si un módulo Perl está instalado?
- 30. Cómo verificar con C# donde está instalado un programa
buena. Pero necesito instalar Framework 4.0 desde local (desde mi aplicación de instalación) – Mediator
Debería ser capaz de modificar fácilmente el script anterior para hacer precisamente eso. Tendrá que descargar el instalador de .NET Framework 4.0 (ya sea Client Profile o Full, cualquiera que sea su aplicación) e incluirlo con los medios de instalación de su aplicación. Luego, desde la secuencia de comandos, en lugar de ir a Internet para buscar el instalador, abra el archivo de instalación existente desde el directorio de origen de la instalación. O simplemente muestre un mensaje que le pida al usuario que lo haga ("Primero, ejecute la aplicación" NetFWSetup.exe "). –
"Ejecute primero la aplicación" NetFWSetup.exe "- y el instalador de programación no es como no hacer? – Mediator