'Check'功能在Inno Setup中执行多次

时间:2017-09-04 12:31:19

标签: .net installation inno-setup

我是Inno Setup脚本的新手,我正在尝试使用以下代码安装.NET framework 3.5作为先决条件。 Check函数正在执行多次。有人可以帮我理解原因吗?

注意:以下代码中的所有其他部分(SetupIcons等)都有适当的内容。

[Files]
Source: "Frameworks\dotnetfx35setup.exe"; DestDir: {tmp}; Flags: deleteafterinstall; \
    BeforeInstall: Install35Framework; Check: Framework35IsNotInstalled
[Code]
function IsDotNetDetected(version: string; service: Cardinal): boolean;
begin
  Result := { ... };
end;

function Framework35IsNotInstalled: Boolean;
begin
  if IsDotNetDetected('v3.5', 1) then
  begin
    MsgBox('Framework35IsNotInstalled: FALSE ', mbConfirmation, MB_YESNO);
    Result := False;
  end else begin
    MsgBox('Framework35IsNotInstalled: TRUE ', mbConfirmation, MB_YESNO);
    Result := True;
  end;
end; 

procedure Install35Framework;
begin
  { ... }
end;

1 个答案:

答案 0 :(得分:2)

引用Check parameter documentation

  

安装程序可能会多次调用每个检查功能,即使只有一个条目使用检查功能。如果您的函数执行了很长的代码,您可以通过仅执行一次代码来优化代码并进行“缓存”。结果是全局变量。

所以行为是按照设计的。

由于您的代码非常简单,我甚至认为它不需要任何优化。如果它运行几次,那就完全没问题了。

如果不是,你可以像这样优化它:

var
  Framework35IsNotInstalledCalled: Boolean; 
  Framework35IsNotInstalledResult: Boolean;

function Framework35IsNotInstalled: Boolean;
begin
  if not Framework35IsNotInstalledCalled then
  begin
    Framework35IsNotInstalledResult := IsDotNetDetected('v3.5', 1);
    Framework35IsNotInstalledCalled := True;
  end;

  Result := Framework35IsNotInstalledResult;
end;