C# 如何在VS2010 Windows Installer中取消和回滚自定义操作?

C# 如何在VS2010 Windows Installer中取消和回滚自定义操作?,c#,installation,windows-installer,custom-action,C#,Installation,Windows Installer,Custom Action,我有一个自定义操作,可通过Windows Installer从受信任的根证书中添加/删除证书。我通过使用 用户可能没有将证书添加到TrustedRoots的权限,或者他们可能选择“取消”,如何回滚以前的操作,并告诉安装程序我已取消该过程 目前,Windows Installer始终报告一个成功响应,即使它失败。这只能通过返回win32 DLL或VBScript自定义操作来完成。如果您使用的是EXE或installer类操作,任何非零返回值都将被视为失败。尝试抛出InstallException。

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

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


目前,Windows Installer始终报告一个成功响应,即使它失败。

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

尝试抛出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.
   }

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

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兼容的自定义操作。我发现允许对MSI创建进行更多控制

我应该在哪里抛出此异常?在哪种情况下?我应该在自定义代码之前还是之后调用Base.SomeAction?我不确定您的代码中是否有此部分,但可能是在自定义代码中有此部分时验证权限的位置,或者在添加证书失败后捕获异常的位置。如前所述,此异常可以在任何重写事件上引发。这是完美的。您能告诉我当抛出InstallException时调用了什么吗?应用程序是否已卸载或必须具有清理功能?引发此异常将初始化回滚操作。如果您需要清除某些内容-覆盖回滚事件并执行staf:异常将作为失败处理。它确实会触发回滚,但用户会认为发生了致命错误。我正在到处寻找示例代码。我应该重写什么来运行自定义代码?在覆盖中,我是在代码之前还是之后调用BaseObject.OverrideAction?覆盖由安装程序类操作使用。您需要win32 DLL或VBScript自定义操作。你可以在这里找到一个C++ DLL自定义动作教程:我是一个.NET开发者,我为开发人员开发了分散的MSFT文档。我发现很难相信win32或VB脚本是唯一的方法。。。我对C方式感兴趣如果您不介意的话,我想看看如何在安装程序中添加/删除证书。@jp2code只要系统允许我登录,我就会发布到codeplex今天有问题吗?-1。。我认为这不适用于生成MSI的Windows安装项目。我没有使用MVC,也没有使用任何与web相关的技术。我误解了吗?@makerofthings7:我们将此用于Wix创建的MSI安装程序。它不仅限于MVC或web相关技术。但是,它确实需要安装wix:@makerofthings7:这是一个与wix兼容的自定义操作。您的问题中没有提到Windows安装项目。谢谢,我将问题标记为Windows Installer,但未在文本中指定。我删除了-1: