【问题标题】:How do I cancel and rollback a custom action in VS2010 Windows Installer?如何取消和回滚 VS2010 Windows Installer 中的自定义操作?
【发布时间】:2011-08-30 16:54:17
【问题描述】:

我有一个自定义操作,可通过 Windows 安装程序从受信任的根证书中添加/删除证书。我通过使用CustomAction

来实现这一点

可能用户没有权限将证书添加到 TrustedRoots,或者他们可能选择“取消”,我该如何回滚之前的操作,并告诉安装程序我已经取消了该过程?

就目前而言,即使失败,Windows 安装程序也会始终报告成功响应。

【问题讨论】:

  • 我有兴趣了解如何在安装程序中添加/删除证书,如果您不介意的话。
  • @jp2code 我会在系统允许我登录后立即发布到xbapcertsetup.codeplex.com(codeplex 今天有问题吗?)

标签: c# installation windows-installer custom-action


【解决方案1】:

您应该将自定义操作设置为返回类型为ActionResult 的函数,这样如果发生取消或其他异常,您可以返回失败类型。

using Microsoft.Deployment.WindowsInstaller;
namespace CustomAction1
{
    public class CustomActions
    {
        [CustomAction]
        public static ActionResult ActionName(Session session)
        {
            try
            {
                session.Log("Custom Action beginning");

                // Do Stuff...
                if (cancel)
                {
                    session.Log("Custom Action cancelled");
                    return ActionResult.Failure;
                }

                session.Log("Custom Action completed successfully");
                return ActionResult.Success;
            }
            catch (SecurityException ex)
            {
                session.Log("Custom Action failed with following exception: " + ex.Message);
                return ActionResult.Failure;
            }
         }
    }
}

注意:这是一个与 WIX 兼容的自定义操作。我找到WIX 以允许对 MSI 创建进行更多控制。

【讨论】:

  • -1 .. 我认为这不适用于产生 MSI 的 Windows 安装程序项目。我没有使用 MVC,也没有使用任何与 Web 相关的技术。我是不是误会了?
  • @makerofthings7:我们将其用于 Wix 创建的 MSI 安装程序。它不限于 MVC 或 web 相关技术。但是,它确实需要安装 wix:advancedinstaller.com/user-guide/qa-c-sharp-ca.html
  • @makerofthings7:这是一个兼容 wix 的自定义操作。在您的问题中没有看到关于 Windows 安装项目的具体提及。
  • 谢谢,我将问题标记为 Windows Installer,但未在文本中指定。我删除了 -1 :)
【解决方案2】:

尝试抛出 InstallException。在这种情况下,安装程序会检测到安装和回滚操作有什么问题。

   public override void Commit(IDictionary savedState)
   {
      base.Commit(savedState);
      Console.WriteLine("Commit ...");
      // Throw an error if a particular file doesn't exist.
      if(!File.Exists("FileDoesNotExist.txt"))
         throw new InstallException();
      // Perform the final installation if the file exists.
   }

【讨论】:

  • 我应该在哪里抛出这个异常? (在哪个覆盖?)我应该在我的自定义代码之前还是之后调用Base.SomeAction()
  • 我不确定您的代码,但可能是您验证权限的位置(如果您的自定义代码中有这样的部分)或在添加证书失败后捕获异常的位置。如here 所述,此异常可以在任何被覆盖的事件上引发。
  • 那是完美的。你能告诉我抛出 InstallException 时会调用什么吗?应用程序是“卸载”还是必须有清理功能?
  • 抛出此异常将初始化回滚操作。如果您需要清理某些东西 - 覆盖回滚事件并执行工作人员:)
  • 异常将作为失败处理。它确实会触发回滚,但用户会认为发生了致命错误。
【解决方案3】:

这只能通过 win32 DLL 或 VBScript 自定义操作通过返回 1602 来完成。如果您使用的是 EXE 或安装程序类操作,则任何非零返回值都将被视为失败。

【讨论】:

  • 我到处寻找示例代码。我应该覆盖什么来运行我的自定义代码?在覆盖范围内,我是在代码之前还是之后调用 BaseObject.OverrideAction()
  • 安装程序类操作使用覆盖。您需要一个 win32 DLL 或 VBScript 自定义操作。您可以在此处找到 C++ DLL 自定义操作教程:codeproject.com/KB/install/msicustomaction.aspx
  • 我是一名 .NET 开发人员,遵循针对我的开发人员类型的分散的 MSFT 文档。我很难相信 win32 或 VB 脚本是 only 方式...我对 C# 方式很感兴趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多