【问题标题】:ByPass MSI Setup Uninstall warning message绕过 MSI 安装程序卸载警告消息
【发布时间】:2014-12-24 01:58:49
【问题描述】:

我有一个 MSI 设置来安装和卸载我的 Windows 服务应用程序。我已经编写了代码来删除 卸载 功能中的 Windows 服务。这里,我的问题是,MSI 设置尝试在 Uninstall 函数调用之前删除文件,然后我收到以下警告消息:

我的安装程序类代码:

[RunInstaller(true)]
    public partial class Installer1 : Installer
    {
        public Installer1()
        {
            InitializeComponent();
        }

        public override void Install(IDictionary savedState)
        {
            base.Install(savedState);
            //Add custom code here
        }


        public override void Rollback(IDictionary savedState)
        {
            base.Rollback(savedState);
            //Add custom code here
        }

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

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

谁能帮我绕过这个错误消息?

【问题讨论】:

    标签: c# visual-studio installation windows-installer


    【解决方案1】:

    您不必使用安装程序类来处理 Windows 服务的安装/卸载。 MSI 能够处理安装/卸载。

    1) 您必须将服务安装程序类添加到您的 Windows 服务项目中。为此,在设计模式下打开您的服务类并右键单击设计视图并查找添加安装程序选项。添加类后,您需要转到服务安装程序类的属性并进行必要的更改(服务名称等)。

    [2] 转到 Windows 服务安装程序项目 (MSI) 的 FileSystemEditor 视图,在那里您应该看到将在安装期间部署的任何 dll 或任何其他文件。右键单击那里并选择Add > Project Output。在弹出窗口中选择“Primary Output”并选择您的 Windows 服务项目。

    [3] 检查安装程序项目并选择解决方案资源管理器窗口顶部的Custom Actions Editor 选项。现在您会在左侧看到安装/卸载/回滚/提交操作。右键单击每个操作,将显示弹出窗口,选择 Application Folder 并选择您在步骤 2 中添加的主输出。现在在安装/卸载时重建 MSI 项目,MSI windows 服务也将自动安装/卸载.

    【讨论】:

      【解决方案2】:

      Visual Studio 部署项目的众多问题之一是它无法公开基础 Windows Installer ServiceInstall 和服务控制表。如果您使用这些,您可能不会遇到任何问题,因为本机功能运行良好。像 ServiceInstaller 这样的自定义操作通常会用更脆弱的解决方案重新发明轮子。

      最好的做法是将您的服务分解到使用 Windows Installer XML (WiX) 编写的合并模块中。然后在您的 MSI 项目中使用此合并模块。这样您就不需要任何自定义操作,它就可以工作。

      或者,完全摆脱这种项目类型并使用 WiX 重写您的安装程序。我维护了一个名为 Industrial Strength Windows Installer XML (IsWiX) 的开源项目,编写这样的安装程序只需要几分钟。您可以在以下位置查看演示:

      Building and Deploying a Windows Service using IsWiX

      【讨论】:

        【解决方案3】:

        该对话框并未告诉您 MSI 正在尝试在卸载之前删除文件 - 它只是一个正在使用的文件对话框,告诉您该服务以及它加载的任何 Dll 可能正在使用中并且不会被删除。它提示您在服务继续之前停止服务并且无法删除正在运行的服务

        在 Visual Studio 安装项目的有限环境中(这显然是您正在使用的),您似乎没有正确执行此操作。 Base.Uninstall() 将卸载服务 - 您不需要这样做,并且 Base.Uninstall 将在文件被删除之前运行。甚至可能是您不必要的 Program.UninstallService 引起了问题,但我们当然看不到代码。大多数人添加到 Base.Uninstall 的是关闭服务并等待它完全完成的代码。如果您没有正确关闭句柄,这也将是一个问题。如果您的代码中有任何内容(例如)不执行 ServiceConteroller.Close(),那么您将看到此消息,因为您的代码引用了该服务。

        【讨论】:

        • 感谢您的回答。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        • 1970-01-01
        相关资源
        最近更新 更多