我有.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."
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版。
答案 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]
部分进行程序集注册。尽管在使用这些常量时仍然需要捕获异常,但您可以更好地控制该工具(例如,如果该工具使用它,您可以获取退出代码以获取错误原因)。