解决程序的另一个版本已安装的异常

时间:2019-07-12 08:00:53

标签: c# windows-services windows-installer uninstall

我正在尝试安装Windows服务,然后再启动它。我不明白为什么经过几个周期(安装+卸载)后,我仍然无法安装或卸载该服务,因为出现错误:

  

已经安装了该产品的另一个版本

但是该服务不再显示在Services窗口中,安装程序也不再显示在Programs部分中。

如果我尝试卸载,我会得到:

  

错误1001:卸载时发生异常。此异常   将被忽略,卸载将继续。但是,卸载   uininstall完成后,可能无法完全卸载。

我不明白我在做什么错。 我已将项目输出添加到所有自定义操作中:

-Install
-Uninstall
-Commit
-Rollback

应该如何执行全新安装/卸载?

安装程序代码

    [RunInstaller(true)]
    public partial class ProjectInstaller : Installer {
        public ProjectInstaller() {
            InitializeComponent();
            this.AfterInstall += ProjectInstaller_AfterInstall;
            this.BeforeUninstall += ProjectInstaller_BeforeUninstall;
        }

        private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e) {
            StartService();
        }

        private void ProjectInstaller_BeforeUninstall(object sender, InstallEventArgs e) {
            StopService();
        }

        private void StartService() {
            Debugger.Launch();
            bool isAdmin = IsAdmin();
            if (isAdmin) {
                using (ServiceController controller = new ServiceController(serviceInstaller1.ServiceName)) {
                    controller.Start();
                }
            } else {
                ProcessStartInfo info = new ProcessStartInfo {
                    Verb = "runas",
                    FileName = "net",
                    Arguments = $"start {serviceInstaller1.ServiceName}"
                };
                Process.Start(info);
            }
        }

        private void StopService() {
            bool isAdmin = IsAdmin();
            if (isAdmin) {
                using (ServiceController controller = new ServiceController(serviceInstaller1.ServiceName)) {
                    controller.Stop();
                }
            } else {
                ProcessStartInfo info = new ProcessStartInfo {
                    Verb = "runas",
                    FileName = "net",
                    Arguments = $"stop {serviceInstaller1.ServiceName}"
                };
                Process.Start(info);
            }
        }

        private static bool IsAdmin() {
           var identity = WindowsIdentity.GetCurrent();
           var princ = new WindowsPrincipal(identity);
           return princ.IsInRole(WindowsBuiltInRole.Administrator);
        }
}

1 个答案:

答案 0 :(得分:0)

  

TEMP Adding this answer, not sure it is relevant until we hear more comments from OP


  

自定义操作 :MSI具有内置的机制,可以 start / stop install / uninstall 服务,它们非常可靠。这些涉及填充许多标准MSI表。使用自定义操作可能会触发您所描述的难以调试和解决的问题。


部署工具 :您使用的是什么工具?


WiX工具集 :WiX是一种免费的开放源代码替代品,您可以检查其他几种主要的部署工具。 Advanced Installer具有一些免费功能,但我认为其中不包括服务安装。虽然值得测试-不错的功能。 Installshield没有我所知道的免费版本,但是功能齐全。 PACE套件是新手。我会全部测试并选择一个-仅2美分。

WiX:服务安装示例