在RUN Section命令中Inno设置错误处理(忽略)

时间:2015-03-08 16:17:58

标签: .net inno-setup

我有.net dll,可以RegAsm .net 3.5.net 4.5

注册

我在设置脚本中使用此代码:

[Run]
Filename: "{dotnet40}\RegAsm.exe"; Parameters: "my.dll"; WorkingDir: "{app}"; Flags: skipifdoesntexist; StatusMsg: "Registering Controls."
Filename: "{dotnet4064}\RegAsm.exe"; Parameters: "my.dll"; WorkingDir: "{app}"; Flags: skipifdoesntexist; StatusMsg: "Registering Controls."
Filename: "{dotnet20}\RegAsm.exe"; Parameters: "my.dll"; WorkingDir: "{app}"; Flags: skipifdoesntexist; StatusMsg: "Registering Controls."
Filename: "{dotnet2064}\RegAsm.exe"; Parameters: "my.dll"; WorkingDir: "{app}"; Flags: skipifdoesntexist; StatusMsg: "Registering Controls."
  • 如果目标计算机上安装了.net 3.5和.net 4.5,则效果很好
  • 我的脚本中有一个函数来检查InitializeSetup中的.net。所以我知道系统中安装了其中一个版本:v3.5 v4 v4.5

但是

我们在某些情况下会收到错误:如果我们在目标计算机上没有.net 3.5

我猜错误的原因是:

  

{dotnet20}

     

.NET Framework 2.0版根目录。 {dotnet20}相当于{dotnet2032},除非安装以64位运行   模式,在这种情况下它等同于{dotnet2064}。

     

如果尝试在没有.NET Framework 2.0版的系统上展开此常量,则会引发异常。

我的问题是如何处理和忽略此异常并阻止安装回滚:

  

内部错误:找不到.Net Framework 2.0版。

1 个答案:

答案 0 :(得分:1)

如果你想坚持[Run]部分并且不在脚本代码中写这个,那么我认为你没有很多选择可供选择。只要不能扩展常量,就会引发异常,就是这种情况。我能想到的唯一选择是添加Check函数,该函数将尝试扩展 protected try..except块中的常量,并防止在异常发生时处理该条目提高。类似下面的内容(基于您的代码,缩短):

[Run]
Filename: "{dotnet20}\RegAsm.exe"; Parameters: "File.dll"; Check: RegAsmDotNet20Exists

[Code]
function RegAsmDotNet20Exists: Boolean;
begin
  try
    // process the entry only if the target binary could be found (and so the
    // folder constant could have been properly expanded)
    Result := FileExists(ExpandConstant('{dotnet20}\RegAsm.exe'));
  except
    // this is the fallback in case the folder constant could not be expanded,
    // or something unexpected happened when checking if the binary file to be
    // executed exists; in such case, don't process the entry
    Result := False;
  end;
end;

另一个更干净,更安全的选择是在一些postinstall事件中纯粹从[Code]部分进行程序集注册。尽管在使用这些常量时仍然需要捕获异常,但您可以更好地控制该工具(例如,如果该工具使用它,您可以获取退出代码以获取错误原因)。