如何使用InnoSetup作为先决条件安装.NET框架?

前端之家收集整理的这篇文章主要介绍了如何使用InnoSetup作为先决条件安装.NET框架?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个类似于 InnoSetup: Verify that .NET 4.0 is installed的问题,但似乎略有不同。
[Files]
Source: "dependencies\dotNetFx40_Full_x86_x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall; 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"

[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,'Software\Microsoft\.NETFramework\policy\v4.0');
end;

如您所见,我正在尝试与GAC注册一个文件。不幸的是在某些机器上可能没有安装.NET框架。所以我需要先安装它。有没有反正我可以强制安装.NET运行时,我尝试注册我的文件

解决方法

由于[文件]部分之后处理了[运行]部分,因此您显示的脚本(因此您的问题)当然不可能做到这一点。有几种方法,我建议的是从安装条目本身的 AfterInstall参数功能执行.NET设置。所以你将删除你当前的[Run]部分并编写一个这样的脚本:
[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,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;

该过程很容易,如果[Files]部分的.NET安装程序条目的Check函数的值为True(FrameworkIsNotInstalled),则处理该条目,将该安装程序二进制文件复制到Inno Setup的临时文件夹中,如果成功, AfterInstall函数之后立即调用InstallFramework。在此功能内部,通过调用Exec功能手动执行.NET设置。

最后,如果所有这些都成功,安装将继续处理下一个[Files]部分条目,这是您将要注册的程序集。现在,安装了.NET框架。所以你可以看到,[Files]部分条目的顺序在这里是至关重要的。

您另外在您的评论中询问,如何向用户展示一些进度,因为执行.NET安装程序时,我发布的方式会阻止[Files]条目,导致显示停止的进度条和文本提取文件。因为.NET安装程序的安装进度并不容易,所以在安装程序执行过程中,我将简单的向使用者显示无限制的选框进度条。

要做到这一点,将设置执行包装成如下代码

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;

这是在.NET安装执行期间向导形式看起来像(进度条是动画):

猜你在找的Delphi相关文章