为什么我的卸载方法没有从msi调用?

时间:2009-03-20 17:55:26

标签: c# .net installer windows-installer

我正在为我的网络应用编写一个安装程序,我正在努力解决卸载程序部分问题。尽管我在我的应用程序安装项目中在Uninstall上创建了一个自定义操作,但InstallerClass设置为true,方法如下:

public override void Uninstall(IDictionary savedState)
    {
        //MessageBox.Show("Attach debugger!", "Viper.Setup");
        Cleanup();
        base.Uninstall(savedState);
    }
似乎没有调用安装程序类上的

。任何想法可能是什么原因?

编辑:我也注意到它不仅没有运行安装程序,而且也没有删除我的主dll文件。更糟糕的是,当我在卸载前一个版本后安装新版本时,这个dll仍然是旧版本(即使安装和卸载成功)

7 个答案:

答案 0 :(得分:5)

您是否在安装程序的“代码操作”选项卡中包含了安装程序代码的输出?

如果那不是它......

我在过去遇到过类似的问题,发现我需要定义所有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);
    }
}

希望这有帮助!

答案 1 :(得分:3)

我实际上并不知道为什么你的覆盖卸载无法正常工作。但每当我面对这个问题 我记录了卸载过程。并据此,您可以轻松检查问题所在的位置!以下是按安装程序类生成日志的方法。

 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 ......并不是那么糟糕......不要把它称为垃圾Plz .. :)

答案 2 :(得分:1)

遇到同样的问题。在这里阅读答案,但乍一看误解了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

答案 3 :(得分:1)

我通过设置&#39; InstallerClass&#39;解决了这个问题。我的自定义操作的属性为False。

答案 4 :(得分:0)

我在这里遇到同样的问题......伤到我的头脑,找出原因!事实证明,我的安装项目将服务的主输出设置为“Release”,而我在“Debug”中将项目更改为安装程序。在我将它们设置为相同的那一刻,我的MessageBoxes弹出以显示正在执行的代码...

..您现在可以将项目更新为更简洁的解决方案:)

答案 5 :(得分:0)

我为wpf应用程序创建了一个安装程序项目,类似于您的设置,请参阅here,此处描述的问题对于此主题不太重要。

  

尽管如此,我遇到了和你描述的问题相同的问题。我有   将该安装程序类放在visual studio安装程序项目中   这会阻止类执行。一切都运作良好   每当安装程序类被放入主应用程序时。

答案 6 :(得分:-1)

我停止使用这些垃圾msi并改为创建了一个zip + cmd脚本。强烈推荐,花了我少10倍来设置并实际工作。