How does one stop a Windows service to do an upgrade install?

前端 未结 4 1019
时光说笑
时光说笑 2021-01-19 10:28

I have developed a Windows service along with a setup project using Visual Studio 2008. When I do an upgrade install I get the following warning:

The following appli

相关标签:
4条回答
  • 2021-01-19 10:38

    If you want to go down the route of editing the MSI ServiceControl table, this following VBS script worked for me:

    Dim installer, database, view, result
    Set installer = CreateObject("WindowsInstaller.Installer")
    Set database = installer.OpenDatabase ("Installer.msi", 1)
    Set view = database.OpenView("INSERT INTO ServiceControl (ServiceControl,Name,Event,Arguments,Wait,Component_) VALUES ('ServiceName','ServiceName',170,null,null,'C__751A71A3822A287367770DB29839A759')") 
    view.Execute
    database.Commit
    Set database = nothing
    
    0 讨论(0)
  • 2021-01-19 10:43

    Look at: Upgrade a Windows Service without Uninstalling

    0 讨论(0)
  • 2021-01-19 10:47

    Its already been built in to the MSI / Windows Installer ... the only problem is that the .NET installer classes doesn't use the MSI "Service Installation" features. What is actually happening is that the MSI is trying to install files and run a custom command using the files just copied (that is all Visual Studio is putting in the MSI).

    To solve it you can edit the MSI with ORCA and add the following row to the ServiceControl table:

    1   ServiceName 170     1   C__489628C5CC1144CB47F43E8BE7F3F31D
    

    The Component ID you can lookup from the FILES table ... I just chose the main EXE file's Component ID. The 170 is a bitmap that tells the Windows Installer to stop and delete the service when Installing and Uninstalling.

    This will clear the road for the .NET installers to add service and you can use the ServiceController to start the service after it's been installed via custom command.

    0 讨论(0)
  • 2021-01-19 10:53

    In WIX, I was able to get the service to shutdown before upgrade and uninstall by adding a "ServiceControl" element to stop the service on install. This seems to do the job, but everything related to MSI is close to black magic, so I am certainly open to any comments. Below is what my service component is defined as:

      <Component Id="ServicePrima" Guid="{d0847344-8632-4326-986c-78f4e02a41bb}">
        <ServiceControl Id="ServicePrima_BeforeInstall" Name="ServicePrima" Stop="install" Wait="yes"/>
        <File Name="PrimaPro.ServicePrima.Check.cmd" />
        <File Name="PrimaPro.ServicePrima.exe" Id="ServicePrimaExe" KeyPath="yes" />
        <File Name="PrimaPro.ServicePrima.exe.config" />
        <File Name="PrimaPro.ServicePrima.Install.cmd" />
        <File Name="PrimaPro.ServicePrima.pdb" />
        <File Name="PrimaPro.ServicePrima.Restart.cmd" />
        <File Name="PrimaPro.ServicePrima.SignalRestart.cmd" />
        <File Name="PrimaPro.ServicePrima.Uninstall.cmd" />
        <File Name="PrimaPro.ServicePrima.xml" />
        <ServiceInstall Id="ServicePrima_Install" Name="ServicePrima" DisplayName="PrimaPro - ServicePrima"
                        Type="ownProcess" Start="auto" Interactive="no" ErrorControl="normal"
                        Description="Manages the database synchronization and configuration management of the PrimaPro System and databases on a machine.">
        </ServiceInstall>
        <!-- Do not need to start service here (i.e. attribute Start="install"), the service will be started by "RestartServices" custom action. -->
        <ServiceControl Id="ServicePrima_AfterInstall" Name="ServicePrima" Stop="uninstall" Remove="uninstall" Wait="yes"/>
      </Component>
    
    0 讨论(0)
提交回复
热议问题