Как отменить и откатить пользовательское действие в установщике Windows VS2010? - PullRequest
4 голосов
/ 30 августа 2011

У меня есть пользовательское действие, которое добавляет / удаляет сертификат из доверенных корневых сертификатов через установщик Windows.Я достигаю этого, используя CustomAction

. Возможно, у пользователя нет прав на добавление сертификата в TrustedRoots или он может выбрать «Отмена», как откатить предыдущийдействия, и сообщите установщику, что я отменил процесс?

В нынешнем виде установщик Windows всегда сообщает об успешном ответе, даже если он не работает.

Ответы [ 3 ]

6 голосов
/ 30 августа 2011

Вы должны настроить свое пользовательское действие для функции с типом возврата 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.

3 голосов
/ 30 августа 2011

Попробуйте сгенерировать исключение 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.
   }
2 голосов
/ 30 августа 2011

Это можно сделать только из пользовательских действий win32 DLL или VBScript, возвращая 1602 .Если вы используете EXE или действие класса установщика, любое ненулевое возвращаемое значение будет рассматриваться как сбой.

...