.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,那么它工作得很好
- 我的脚本中有一个函数,可以在
中检查.net。所以我知道系统上安装了其中一个版本:v3.5 v4.5InitializeSetup
如果您希望坚持使用
[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;