首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安装ByPass MSI卸载警告消息

安装ByPass MSI卸载警告消息
EN

Stack Overflow用户
提问于 2014-12-23 09:53:38
回答 3查看 990关注 0票数 0

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

我的安装程序类代码:

代码语言:javascript
复制
[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);
        }
    }

有人能帮我绕过这个错误信息吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-23 12:36:29

您不必使用installer类处理windows服务的安装/卸载。MSI能够处理安装/卸载。

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-12-23 13:01:16

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

这里最好的方法是将您的服务合并到使用(WiX)编写的合并模块中。然后在MSI项目中使用这个合并模块。这样,您不需要任何自定义操作,它只是工作。

或者,完全摆脱这个项目类型,使用WiX重写您的安装程序。我维护一个名为(IsWiX)的开源项目,编写这样的安装程序只需几分钟。您可以在以下网站看到演示:

使用IsWiX构建和部署Windows

票数 0
EN

Stack Overflow用户

发布于 2014-12-23 17:58:49

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27617933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档