【问题标题】:Why is my Uninstall method not called from the msi?为什么没有从 msi 调用我的卸载方法?
【发布时间】:2009-03-20 17:55:26
【问题描述】:

我正在为我的网络应用程序编写安装程序,但我在卸载程序部分遇到了困难。尽管我在我的应用程序设置项目中创建了一个关于卸载的自定义操作,但 InstallerClass 设置为 true,方法:

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

似乎没有调用安装程序类。任何想法可能是什么原因?

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

【问题讨论】:

    标签: c# .net installation windows-installer


    【解决方案1】:

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

    如果不是这样的话……

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

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      我实际上不知道为什么您的覆盖卸载不起作用。但是每当我遇到这个问题时 我记录了卸载过程。并据此您可以轻松检查问题所在!下面是通过安装程序类制作日志的方法。

       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
              { }
          }
      

      并在 Override 函数中调用此方法,如 ->

       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 ..:)

      【讨论】:

        【解决方案3】:

        遇到同样的问题。在这里阅读答案,但乍一看误解了 dynaclips 的有用答案。

        您是否将安装程序代码的输出包含在代码操作中 安装程序的标签?

        所以在这里为了更清楚,截图...

        最后在这里相同的覆盖,但在 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
        

        【讨论】:

          【解决方案4】:

          我通过将自定义操作的“InstallerClass”属性设置为 False 解决了这个问题。

          【讨论】:

            【解决方案5】:

            我在这里也遇到了同样的问题...为了找出原因而头疼!!!事实证明,尽管我的安装项目将服务的主要输出设置为“发布”,而我正在对“调试”中的安装程序进行项目更改。当我将它们设置为相同的那一刻,我的 MessageBoxes 弹出以显示代码正在执行...

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

            【讨论】:

              【解决方案6】:

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

              不过,我遇到了与您描述的相同的问题。我有 将该安装程序类放在 Visual Studio 安装程序项目中 这会阻止类执行。一切运作良好 每当将安装程序类放入主应用程序时。

              【讨论】:

                【解决方案7】:

                我停止使用这些垃圾 msi,而是创建了一个 zip + cmd 脚本。强烈推荐,我的设置时间少了 10 倍,而且确实有效。

                【讨论】:

                • 您是否处理所有对机器的修改的卸载、升级和回滚?
                • 是的,我都实现了
                • 我已经完成了这两种方式 - 自定义程序安装 exe 和 VS 设置 - 并且可以完全理解 Grzenio 的声明。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-08-01
                • 1970-01-01
                • 1970-01-01
                • 2017-12-07
                • 2019-07-03
                相关资源
                最近更新 更多