我有一个类似于
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安装执行期间向导形式看起来像(进度条是动画):