ByPass MSI设置卸载警告消息

时间:2014-12-23 09:53:38

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

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

enter image description here

我的安装程序类代码:

[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);
        }
    }

任何人都可以帮助我绕过这个错误消息吗?

3 个答案:

答案 0 :(得分:1)

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

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

enter image description here

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

enter image description here

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

enter image description here

答案 1 :(得分:0)

Visual Studio部署项目的许多问题之一是它无法公开底层的Windows Installer ServiceInstall和Service控制表。如果你使用这些,你可能没有任何问题,因为本机功能非常好。像ServiceInstaller这样的自定义操作通常会使用更脆弱的解决方案重新发明轮子。

这里最好的做法是将您的服务纳入使用Windows Installer XML(WiX)创作的合并模块。然后在MSI项目中使用此合并模块。这样您就不需要任何自定义操作,只是有效。

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

Building and Deploying a Windows Service using IsWiX

答案 2 :(得分:0)

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

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