Comment puis-je install.NET le cadre comme condition préalable à L'utilisation D'InnoSetup?

j'ai une question similaire à Inno Setup: vérifiez que .NET 4.0 est installé , mais elle semble légèrement différente.

[Files]
Source: "dependenciesdotNetFx40_Full_x86_x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall; Check: FrameworkIsNotInstalled
Source: "C:WindowsMicrosoft.NETassemblyGAC_MSILMySql.Datav4.0_6.5.4.0__c5687fc88969c44dMySql.Data.dll"; DestDir: "{app}lib"; StrongAssemblyName: "MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, ProcessorArchitecture=MSIL"; Flags: "gacinstall sharedfile uninsnosharedfileprompt"

[Run]
Filename: {tmp}dotNetFx40_Full_x86_x64.exe; Description: Install Microsoft .NET Framework 4.0; Parameters: /q /norestart; Check: FrameworkIsNotInstalled

[code]
function FrameworkIsNotInstalled: Boolean;
begin
  Result := not RegKeyExists(HKEY_LOCAL_MACHINE, 'SoftwareMicrosoft.NETFrameworkpolicyv4.0');
end;

Comme vous pouvez le voir, j'essaie d'enregistrer un fichier avec le GAC. Malheureusement sur certaines machines, il est possible que le .net framework soit et non installé. J'ai donc besoin de l'installer en premier. Est - ce qu'il y a de toute façon que je peux forcer une installation du runtime .NET avant j'essaie d'enregistrer mes fichiers?

33
demandé sur Community 2013-12-24 03:42:00

4 réponses

puisque la section [Run] est traitée après la section [Files] , il est naturellement impossible de le faire avec le script que vous avez montré (d'où votre question). Il y a peu de façons Où je recommande d'exécuter la configuration .NET à partir de la fonction de paramètre AfterInstall de l'entrée de configuration elle-même. Donc vous retireriez votre section actuelle [Run] et écririez un script comme ceci:

[Files]
Source: "dependencies\dotNetFx40_Full_x86_x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall; AfterInstall: InstallFramework; Check: FrameworkIsNotInstalled
Source: "C:\Windows\Microsoft.NET\assembly\GAC_MSIL\MySql.Data\v4.0_6.5.4.0__c5687fc88969c44d\MySql.Data.dll"; DestDir: "{app}\lib"; StrongAssemblyName: "MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, ProcessorArchitecture=MSIL"; Flags: gacinstall sharedfile uninsnosharedfileprompt

[Code]
procedure InstallFramework;
var
  ResultCode: Integer;
begin
  if not Exec(ExpandConstant('{tmp}\dotNetFx40_Full_x86_x64.exe'), '/q /norestart', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
  begin
    { you can interact with the user that the installation failed }
    MsgBox('.NET installation failed with code: ' + IntToStr(ResultCode) + '.',
      mbError, MB_OK);
  end;
end;

le le processus est facile, si la fonction Check de L'entrée de configuration .NET de la section [Files] est évaluée à True ( FrameworkIsNotInstalled ), l'entrée est traitée, qui copie le binaire setup dans le dossier temporaire D'Inno Setup et si cela réussit, la fonction AfterInstall InstallFramework est appelée immédiatement après. À l'intérieur de cette fonction, la configuration.net est exécutée manuellement en appelant la fonction Exec .

et enfin, si tout cela réussit, l'installation continue de traiter la prochaine entrée de section [Files] , qui est votre assemblage qui va être enregistré. Maintenant, avec le framework. net installé. Comme vous pouvez le voir, l'ordre des entrées de la section [Files] est crucial ici.


" vous avez en outre demandé dans votre commentaire, comment montrer à l'Utilisateur quelques progrès, depuis l'exécution de la configuration .NET dans la façon dont je l'ai posté ici bloque l'entrée [Files] , qui conduit à afficher la barre de progression arrêtée et le texte sur l'extraction de fichiers. Comme il ne serait pas facile d'obtenir la progression de l'installation de .NET setup, je montrerais simplement à l'utilisateur la barre de progression sans fin de marquee pendant l'exécution de cette configuration.

pour faire cette envelopper que l'exécution de configuration dans un code comme ceci:

procedure InstallFramework;
var
  StatusText: string;
begin
  StatusText := WizardForm.StatusLabel.Caption;
  WizardForm.StatusLabel.Caption := 'Installing .NET framework...';
  WizardForm.ProgressGauge.Style := npbstMarquee;
  try
    { here put the .NET setup execution code }
  finally
    WizardForm.StatusLabel.Caption := StatusText;
    WizardForm.ProgressGauge.Style := npbstNormal;
  end;
end;

voici à quoi ressemble la forme de l'assistant pendant L'exécution de la configuration de .NET (la la barre de progression est animée):

enter image description here

55
répondu TLama 2017-05-23 12:34:38

je veux juste ajouter quelque chose à @TLama: la fermeture lorsque la configuration échoue. Ce n'est pas si facile parce que WizardForm.Close; n'invoque que le bouton cancel qui peut être abandonné par l'utilisateur. Enfin, le code peut ressembler à cela:

[Code]
var CancelWithoutPrompt: boolean;

function InitializeSetup(): Boolean;
begin
  CancelWithoutPrompt := false;
  result := true;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID=wpInstalling then
    Confirm := not CancelWithoutPrompt;
end;

function FrameworkIsNotInstalled: Boolean;
begin
  Result := not RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full');
end;

procedure InstallFramework;
var
  StatusText: string;
  ResultCode: Integer;
begin
  StatusText := WizardForm.StatusLabel.Caption;
  WizardForm.StatusLabel.Caption := 'Installing .NET framework...';
  WizardForm.ProgressGauge.Style := npbstMarquee;
  try
      if not Exec(ExpandConstant('{tmp}\dotNetFx45_Full_asetup.exe'), '/q /norestart', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
  begin
    // you can interact with the user that the installation failed
    MsgBox('.NET installation failed with code: ' + IntToStr(ResultCode) + '.',
      mbError, MB_OK);
    CancelWithoutPrompt := true;
    WizardForm.Close;       
  end;
  finally
    WizardForm.StatusLabel.Caption := StatusText;
    WizardForm.ProgressGauge.Style := npbstNormal;
  end;
end;
9
répondu Snicker 2016-03-19 08:08:46

juste mes 2 cents sur la vérification de .net Framework 4.7, correspond à la réponse de @Snicker:

function FrameworkIsNotInstalled: Boolean;
var
  ver: Cardinal;
begin
  Result :=
    not
    (
    (RegKeyExists(
      HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client')
    and
        RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client', 'Release', ver)
    )
    or
    (RegKeyExists(
      HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full')
    and
        RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full', 'Release', ver)
    )
    )
    and (ver < 460798)
end;
6
répondu BananaAcid 2017-05-18 00:12:15

vous pouvez également le configurer pour télécharger le bootstrapper web et l'exécuter si vous ne voulez pas l'empaqueter dans le très lourd installateur full .NET. J'ai écrit un billet de blog sur la façon de faire cela avec Inno Download Plugin .

0
répondu RandomEngy 2018-09-20 22:17:20