我有一个 .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
InitializeSetup
。所以我知道系统上安装了以下版本之一: v3.5 v4 v4.5
But
在某些情况下我们会遇到这样的错误:如果目标机器上没有 .NET 3.5
我猜错误原因是:
{dotnet20}
.NET Framework 2.0 版根目录。 {dotnet20} 相当于 {dotnet2032},除非安装在 64 位中运行
模式,在这种情况下它相当于 {dotnet2064}。
如果尝试在不存在 .NET Framework 2.0 版的系统上扩展此常量,则会引发异常。
我的问题是如何处理和忽略此异常并防止安装回滚:
内部错误:找不到 .Net Framework 2.0 版。
如果你想坚持[Run]
部分并且不要将其写入脚本代码中,那么我认为您没有太多选项可供选择。每当常量无法扩展时就会引发异常,这就是这种情况。我能想到的唯一选择是添加Check
函数将尝试扩展常数受保护的 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;
另一个更干净、更安全的选择是纯粹从[Code]
一些安装后事件中的部分。即使您在使用这些常量时仍然需要捕获异常,但您可以更好地控制该工具(例如,如果该工具使用它,您可以获取退出代码来获取错误原因)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)