56 votes

Inno Setup : Vérifiez que .NET 4.0 est installé.

J'ai un composant qui nécessite .NET 4.0 pour fonctionner. Comment le programme d'installation d'Inno Setup peut-il vérifier qu'il est installé et, dans le cas contraire, inviter l'utilisateur à l'installer ?

90voto

Cody Gray Points 102261

Le InitializeSetup fonction est appelée lorsque l'Inno exécutable du programme d'Installation est exécuté. L'insertion de ce code pour un script personnalisé devrait faire ce que vous voulez:

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.4322'     .NET Framework 1.1
//    'v2.0.50727'    .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
//
// 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: string;
    install, serviceCount: cardinal;
    success: boolean;
begin
    key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version;
    // .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 uses 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;
    result := success and (install = 1) and (serviceCount >= service);
end;

function InitializeSetup(): Boolean;
begin
    if not IsDotNetDetected('v4\Client', 0) then begin
        MsgBox('MyApp requires Microsoft .NET Framework 4.0 Client Profile.'#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;

(Code à partir d'ici: http://www.kynosarges.de/DotNetVersion.html)

Tout d'abord, il vérifie la présence d'une entrée de registre qui indique la version de l' .NET framework est installé. Si l'entrée de registre n'est pas présente, il invite l'utilisateur à télécharger le .NET framework. Si l'utilisateur répond Oui, il ouvre l'URL de téléchargement. (Vous pouvez avoir à changer la version, il spécifie dans le script de la version 4.0.)


Je suis aussi tombée sur cet article sur CodeProject, qui peut être un plus complet et personnalisable façon de faire ce que vous cherchez, même si elle peut prendre plus de travail pour comprendre et devra être modifié pour fonctionner avec la version 4.0.

29voto

David Taylor Points 1023

@Cody Gris - Merci pour votre solution. Très utile!

Dans le cas où quelqu'un est intéressé, voici mon point de vue sur sa fonction à l'aide des valeurs d'une énumération à la place de chaînes de caractères. Ce changement est purement une question de préférence personnelle. Le code inclut les modifications pour v4.5 et semble fonctionner correctement selon mes tests limités.

David

[Code]

type
//
 // L'énumération est utilisée pour spécifier une .NET framework version 
//
 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 Installation Complète
 DotNet_v45); // .NET Framework 4.5

//
// Vérifie si le spécifiée .NET Framework version et le service pack
// est installé (Voir: http://www.kynosarges.de/DotNetVersion.html)
//
// Paramètres:
// Version - Requis .NET Framework version
// ServicePack - Requis niveau de service pack (0: Aucun 1: SP1, 2: SP2 etc.)
//
fonction IsDotNetInstalled(Version: TDotNetFramework; ServicePack: le cardinal): boolean;
var
 KeyName : string;
 Check45 : boolean;
 Succès : boolean;
 InstallFlag : cardinal; 
 ReleaseVer : cardinal;
 ServiceCount : cardinal;
commencer
 // Chemin d'accès du registre de la demande .Version NET
 KeyName := 'SOFTWARE\Microsoft\NET Framework Setup\NPD\';

 cas de la Version de
 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\Pleine";
 DotNet_v45: KeyName := KeyName + 'v4\Pleine";
fin;

 // .NET 3.0 utilise "InstallSuccess" clé en sous-clé de Configuration
 si (Version = DotNet_v30) puis
 Succès := RegQueryDWordValue(HKLM, KeyName + '\Setup', 'InstallSuccess', InstallFlag) d'autre
 Succès := RegQueryDWordValue(HKLM, KeyName "Installer", InstallFlag);

 // .NET 4.0/4.5 utilise "de service" clé au lieu de "SP"
 si (Version = DotNet_v4_Client) ou
 (Version = DotNet_v4_Full) ou
 (Version = DotNet_v45) puis
 Succès := Succès et RegQueryDWordValue(HKLM, KeyName, 'Maintenance', ServiceCount) d'autre
 Succès := Succès et RegQueryDWordValue(HKLM, KeyName "SP", ServiceCount);

 // .NET 4.5 est distingué .NET 4.0 par le relâchement de la touche
 si (Version = DotNet_v45) puis
commencer
 Succès := Succès et RegQueryDWordValue(HKLM, KeyName "Libération", ReleaseVer);
 Réussite : Réussite= et (ReleaseVer >= 378389);
fin;

 Résultat: Réussite= et (InstallFlag = 1) et (ServiceCount >= ServicePack);
fin;

0 votes

Pouvez-vous me dire le nom de la clé de registre pour détecter la version 4.6.1 ? Pour que je puisse étendre votre code ? Merci

0 votes

@David j'ai donc étendu votre code comme ceci pour la version 4.6. 1 version if (Version = DotNet_v4_6_1) then begin Success := Success and RegQueryDWordValue(HKLM, KeyName, 'Release', ReleaseVer) ; Success := Success and (ReleaseVer >= 394271) ; end ; Mais je m'interroge sur la valeur de InstallFlag à la dernière ligne Result := Success and (InstallFlag = 1) and (ServiceCount >= ServicePack) ; if pass to the function with version as DotNet_v4_6_1 ? Parce qu'elle ne reçoit jamais de valeur et qu'elle n'est pas initialisée. Un commentaire s'il vous plaît ? Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X