【问题标题】:Checking for successful uninstall检查是否成功卸载
【发布时间】:2013-06-19 02:05:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • @Soner Gönül:我有多种方法可以解决这个问题,我可以设置一个名为“卸载成功”的注册表项,然后将其设置为 true 作为卸载时的自定义操作——但是这个非常脏。如果您有任何好的做法或好的想法,我想在提交之前先听听。
  • 您应该通过检查文件、目录、注册表项等是否存在来镜像您以前版本的安装程序...
  • @Romoku 无法保证我检查的任何文件或文件夹在产品生命周期的后期仍然存在。
  • 你可以为每个版本保留一个信息目录,用于验证应用程序的完整性,或者创建某种更新程序来管理安装/卸载,然后假设它不存在机器很干净。
  • @Romoku 它们仍然是相当肮脏的修复,如果代码结构允许,我会让 WiX 处理更新。

标签: c# .net wix multiple-instances windows-installer


【解决方案1】:

您可以使用 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 会抛出异常。

【讨论】:

    【解决方案2】:

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

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

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


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

    【讨论】:

    • 我正纠结于一些有趣的动态多重实例化,我找不到提供升级代码的方法,因此这可以在不影响其他实例的情况下工作。对不起,我可能应该标记这个..
    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多