1

我正在尝试自动化安装过程,在该过程中我卸载以前的版本并在顶部安装较新的版本。如果卸载成功,我应该如何测试(在我的引导程序中,用 C# 编码)?

这就是我目前启动卸载的方式。

Process p = Process.Start("msiexec", /*various switches*/);
p.WaitForExit();

我目前也在纠结动态的多个实例,这真的让我心烦意乱,所以在 WiX 本身中处理这个问题即使不是不可能也很困难。

4

2 回答 2

2

您可以使用 Windows Installer API,而不是通过 msiexec 调用 Windows Installer。您可以通过 P/Invoke、激活 COM 接口或通过 WiX 的 DTF 包装库来做到这一点。用于删除产品的特定功能是 MsiConfigureProductEx

使用 DTF,您可以这样做:

Installer.SetInternalUI(InstallUIOptions.Silent);
Installer.SetExternalUI(UiHandler, InstallLogModes.Verbose);
Installer.EnableLog(InstallLogModes.None, null);
Installer.ConfigureProduct(productCode, 0, InstallState.Removed, "");
Console.WriteLine("RebootRequired: {0}   RebootInitiated: {1}", Installer.RebootRequired, Installer.RebootInitiated);

UiHandler委托允许应用程序监控进度。如果有错误,DTF 会抛出异常。

于 2013-06-18T18:05:01.983 回答
2

作为在引导程序中处理此问题的替代方法,并假设新版本的安装程序是正在开发的 Windows Installer 程序包 (.msi),您可以在需要时使用 Windows Installer 功能卸载旧版本。当您这样做时,升级可以是以下之一:

  • 主要升级——UpgradeCode 属性相同;产品代码不同
  • 次要升级——UpgradeCode 和 ProductCode 属性相同;ProductVersion 更高
  • 相关产品移除- 由您指定的任何 UpgradeCodes 移除

主要升级基本上是删除旧版本并安装新版本。WiX 允许您很容易地在安装项目中创作任何这些。

因此,您的引导程序只需要安装较新的版本,然后让 Windows Installer 完成其余的工作。


顺便说一句——你可能想看看使用 WiX 引导程序而不是编写自己的逻辑。如果您愿意,您可以在 .NET 中为 WiX 引导程序编写自定义 UI,如果这就是您编写自己的引导程序的原因。

于 2013-06-17T16:36:16.407 回答