.net 运行部分命令中的Inno设置错误处理(忽略)

.net 运行部分命令中的Inno设置错误处理(忽略),.net,inno-setup,.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." Filena

我有一个
.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.5
但是

在某些情况下会出现如下错误:如果目标机器上没有.net 3.5

我想错误的原因是:

{dotnet20}

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

如果试图在不存在.NET Framework 2.0版的系统上扩展此常量,将引发异常。

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

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


如果您希望坚持使用
[Run]
部分,并且不在脚本代码中编写此部分,那么我认为您没有太多选项可供选择。每当常量无法展开时,就会引发异常,这就是这种情况。我能想到的唯一选项是添加一个
Check
函数,该函数将尝试在受保护的
try..except
块中展开常量,并防止在引发异常时处理条目。如下所示(根据您的代码,简称):


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

您应该使用
检查
并在其功能中验证您是否能够找到目标二进制文件,当某个常量无法展开时也会捕获,理想情况下,对于所有条目都是如此。因为这是相当多的工作,我会考虑写这个注册纯粹在一些<代码> [代码] < /代码>事件。当然,即使在那里也会提出例外情况,但工作要少一点。在
[Run]
一节中,我不知道有什么其他方法可以克服这个问题,而不检查
可以防止即将发生的故障(适用于这种情况)。另一种方法可能是提取Inno Setup如何扩展这些常量并在代码中使用它。这可能不是什么异常情况。@TLama谢谢,我在您的评论之前尝试了
检查
,并再次看到错误。因此,我在
.NET4.5
下生成了我的应用程序的新版本,并删除了一些代码和。。。知道我的设置工作得很好。所以,当你尝试你的尝试时,你是否在扩展常数时捕捉到异常(你必须)?如果是,您在从调试器运行时在IDE中看到的对话框是否异常(这是默认行为;您需要确认它并通过F9继续调试)?Sidenote;请注意,在默认情况下,无论异常是如何处理的。
[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;