Почему мой метод удаления не вызывается из MSI? - PullRequest
3 голосов
/ 20 марта 2009

Я пишу установщик для моего веб-приложения, и я борюсь с частью деинсталлятора. Несмотря на то, что я создал настраиваемое действие для удаления в моем проекте установки приложения, для InstallerClass задано значение true, метод:

public override void Uninstall(IDictionary savedState)
    {
        //MessageBox.Show("Attach debugger!", "Viper.Setup");
        Cleanup();
        base.Uninstall(savedState);
    }

в классе установщика, кажется, не вызывается. Есть идеи, в чем может быть причина?

РЕДАКТИРОВАТЬ: Я также заметил, что он не только не запускает установщик, но и не удаляет мой основной файл DLL. Что еще хуже, когда я устанавливаю новую версию после удаления предыдущей, эта dll остается старой (даже если установка и удаление были успешными)

Ответы [ 7 ]

5 голосов
/ 20 марта 2009

Включили ли вы вывод кода вашего установщика на вкладку «Действия с кодом» установщика?

Если это не так ...

В прошлом я столкнулся с подобной проблемой и обнаружил, что мне нужны все 4 метода, иначе удаление не будет выполнено. Добавьте свой код в шаблон ниже:

[RunInstaller(true)]
public class MyInstaller: Installer
{
    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);
    }

    public override void Commit(IDictionary savedState)
    {
        base.Commit(savedState);
    }

    public override void Rollback(IDictionary savedState)
    {
        base.Rollback(savedState);
    }

    public override void Uninstall(IDictionary savedState)
    {
        base.Uninstall(savedState);
    }
}

Надеюсь, это поможет!

3 голосов
/ 08 сентября 2012

Я не знаю, на самом деле, почему ваша переопределенная деинсталляция не работает. Но всякий раз, когда я сталкиваюсь с этой проблемой Я делаю журнал процесса удаления. И в соответствии с этим вы можете легко проверить, где находится проблема! Вот метод создания журнала по классу установщика.

 private string logFilePath = "C:\\SetupLog.txt";    
 public void Log(string str)
    {
        StreamWriter Tex;
        try
        {
            Tex = File.AppendText(this.logFilePath);
            Tex.WriteLine(DateTime.Now.ToString() + " " + str);
            Tex.Close();
        }
        catch
        { }
    }

и вызовите этот метод в функции переопределения, как ->

 public override void Uninstall(IDictionary savedState)
    {
       try 
          {
             base.Uninstall(savedState);
             Log("Omg :O it works !");    
           }
      catch(Exception ex)
           {
             Log(ex.Message.ToString());
           }     
    }

Наконец-то Windows msi ... не так уж и плохо .. Просто не называйте это ерундой, плз ..:)

1 голос
/ 08 декабря 2017

Я решил эту проблему, установив для свойства «InstallerClass» моего настраиваемого действия значение False.

1 голос
/ 17 марта 2017

Получил ту же проблему. Прочитайте ответы здесь, но с первого взгляда неправильно поняли полезный ответ от dynaclips.

Включили ли вы вывод вашего установочного кода в действия кода вкладка установщика?

Итак, чтобы было понятнее, скриншоты ...

Mising custom action

Custom actions for uninstall and rollback

И, наконец, здесь те же переопределения, но в VB.net

Public Class Installer1

Public Sub New()
    MyBase.New()

    'This call is required by the Component Designer.
    InitializeComponent()

    'Add initialization code after the call to InitializeComponent
End Sub

<Security.Permissions.SecurityPermission(Security.Permissions.SecurityAction.Demand)>
Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
    MyBase.Install(stateSaver)
    YourCustomInstallAction2BeRenamed()
End Sub


<Security.Permissions.SecurityPermission(Security.Permissions.SecurityAction.Demand)>
Public Overrides Sub Commit(ByVal savedState As System.Collections.IDictionary)
    MyBase.Commit(savedState)
End Sub

<Security.Permissions.SecurityPermission(Security.Permissions.SecurityAction.Demand)>
Public Overrides Sub Rollback(ByVal savedState As System.Collections.IDictionary)
    MyBase.Rollback(savedState)
    YourCustomRollbackAction2BeRenamed()
End Sub

<Security.Permissions.SecurityPermission(Security.Permissions.SecurityAction.Demand)>
Public Overrides Sub Uninstall(ByVal savedState As System.Collections.IDictionary)
    MyBase.Uninstall(savedState)
    YourCustomDeleteAction2BeRenamed()
End Sub
0 голосов
/ 02 октября 2015

Я создал проект установщика для приложения wpf, аналогично вашей настройке, см. здесь , описанная проблема здесь менее важна для этой темы.

Тем не менее, я столкнулся с той же проблемой, что вы описали. Я поместил этот класс установщика в проект установщика visual studio что препятствует выполнению класса. Все работало хорошо всякий раз, когда класс установщика помещался в основное приложение.

0 голосов
/ 01 февраля 2011

У меня была такая же проблема ... повредил голову, чтобы понять почему !!! Однако оказалось, что в моем проекте установки был установлен основной выход службы «Релиз», в то время как я вносил изменения в проект установщика в «Отладка». В тот момент, когда я установил их одинаковыми, мои MessageBoxes всплыли, чтобы показать, что код выполняется ...

.. теперь вы можете обновить свой проект до более аккуратного решения:)

0 голосов
/ 24 августа 2009

Я перестал использовать эти мусорные MSI-файлы и вместо этого создал скрипт zip + cmd. Настоятельно рекомендуется, мне потребовалось в 10 раз меньше, чтобы настроить и на самом деле работает.

...