简体   繁体   English

安装 .NET Core 3.0 Worker Service 和 WiX 作为 Windows 服务

[英]Install .NET Core 3.0 Worker Service with WiX as Windows Service

With the new release of .NET Core 3, I am trying to make a windows service with the new worker service template.随着 .NET Core 3 的新版本发布,我正在尝试使用新的工作服务模板制作 windows 服务。 I need to be able to install this with group policy, and WiX seems to be the tool for the job.我需要能够使用组策略安装它,而 WiX 似乎是这项工作的工具。

I've created the.wxs file and without specifying the ServiceInstall section, it installs fine.我已经创建了 .wxs 文件,并且没有指定 ServiceInstall 部分,它安装得很好。

Here's my file: UPDATED这是我的文件:已更新

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="SystemInformationService" Language="1033" Version="1.0.0.0" Manufacturer="MyCompany" UpgradeCode="f08191cf-461e-481b-a2a1-6f54d6ae5331">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

    <!-- Embed cab files, don't include them in the output -->
    <MediaTemplate EmbedCab="yes"/>

    <!-- Default WiX dialog set -->
    <UIRef Id="WixUI_Mondo" />

    <!-- License agreement -->
    <WixVariable Id="WixUILicenseRtf" Value="LicenseAgreement.rtf" />

    <Feature Id="ProductFeature" Title="SystemInformationService.Setup" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
      <ComponentGroupRef Id="HeatGenerated" />
    </Feature>
  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="SystemInformationService" />
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
      <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
      <Component Id="ProductComponent" Guid="5BB7300D-C29F-4C87-B461-AAE3AA4EB56D">
        <CreateFolder/>
        <!--<File Source="$(var.SystemInformationService.TargetPath)" />-->
        <ServiceInstall
          Id="ServiceInstaller"
          Type="ownProcess"
          Name="SystemInformationService"
          DisplayName="System Information Service"
          Description="System Information service by MyCompany"
          Start="auto"
          Vital="no"
          Account="LocalSystem"
          Interactive="no"
          ErrorControl="normal" />
        <ServiceControl
          Id="ServiceInstaller"
          Start="install"
          Stop="both"
          Remove="uninstall"
          Name="SystemInformationService"
          Wait="yes" />
      </Component>
    </ComponentGroup>
  </Fragment>
</Wix>

Now I'm trying to add the service components so that it will start on install.现在我正在尝试添加服务组件,以便它在安装时启动。 When I run the installer after adding it, the installer UI hangs on 'Starting Service...'.添加后运行安装程序时,安装程序 UI 挂在“正在启动服务...”上。 I tried adding the 'start' arguments since I saw that on another answer.我尝试添加“开始” arguments ,因为我在另一个答案中看到了这一点。

I'm thinking since this is .net core, I might need to add an action.exe or something to start the service.我在想,因为这是 .net 核心,我可能需要添加一个 action.exe 或其他东西来启动服务。 That's all I can think of - any suggestions will help.这就是我能想到的 - 任何建议都会有所帮助。

Thanks谢谢

UPDATE: I've updated the.wxs file to what I now have, and I have it correctly installing with a framework dependent deployment.更新:我已经将 .wxs 文件更新为我现在拥有的文件,并且我已经使用依赖于框架的部署正确安装了它。 My problem was specifying AnyCPU instead of x86.我的问题是指定 AnyCPU 而不是 x86。 But... Now when I switch to a self-contained deployment I get the same error as before.但是...现在,当我切换到独立部署时,我遇到了与以前相同的错误。 So It must be something to do with how I'm publishing the .net core.所以这一定与我如何发布 .net 内核有关。

This is my publish profile currently.这是我目前的发布资料。 When i switch to framework dependent the installer runs fine and starts the service.当我切换到依赖框架时,安装程序运行良好并启动服务。 这是我目前的发布资料。当我切换到依赖框架时,安装程序运行良好并启动服务。

Figured it out.弄清楚了。 What I was missing was the.exe of the service must be defined above the 'ServiceInstall' and 'ServiceControl' tags in the.wxs.我缺少的是服务的.exe 必须在.wxs 中的“ServiceInstall”和“ServiceControl”标记之上定义。 So what I needed to do was create a filter.xslt to filter the.exe out of the heat generated file, then add a tag to the Service component (with keypath='yes') above ServiceInstall.所以我需要做的是创建一个filter.xslt 来过滤掉热生成文件中的.exe,然后在ServiceInstall 上面的Service 组件中添加一个标签(keypath='yes')。

Below is my final.wxs and.xslt下面是我的final.wxs和.xslt

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="SystemInformationService" Language="1033" Version="1.0.2.0" Manufacturer="MyCompany" UpgradeCode="f08191cf-461e-481b-a2a1-6f54d6ae5331">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Upgrade Id="f08191cf-461e-481b-a2a1-6f54d6ae5331">
      <UpgradeVersion
         Minimum="1.0.0" Maximum="99.0.0"
         Property="PREVIOUSVERSIONSINSTALLED"
         IncludeMinimum="yes" IncludeMaximum="no" />
    </Upgrade>
    <MajorUpgrade DowngradeErrorMessage="A newer version of System Information Service is already installed." />

    <!-- Embed cab files, don't include them in the output -->
    <MediaTemplate EmbedCab="yes"/>

    <!-- Default WiX dialog set -->
    <UIRef Id="WixUI_Minimal" />

    <!-- License agreement -->
    <WixVariable Id="WixUILicenseRtf" Value="LicenseAgreement.rtf" />

    <Feature Id="ProductFeature" Title="SystemInformationService.Setup" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
      <ComponentGroupRef Id="HeatGenerated" />
    </Feature>

    <!--<CustomAction Id="installService" Directory="INSTALLFOLDER" Execute="commit" ExeCommand="sc create SystemInformationService binPath=INSTALLFOLDER/SystemInformationService.exe" Return='ignore'/>
    <CustomAction Id="testAction" Directory="INSTALLFOLDER" Execute="commit" ExeCommand="notepad.exe test.txt" Return='ignore'/>
    <CustomAction Id="startService" Directory="INSTALLFOLDER" Execute="commit" ExeCommand="sc start binPath=INSTALLFOLDER/SystemInformationService.exe" Return='ignore'/>-->

  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="SystemInformationService" />
      </Directory>
    </Directory>
  </Fragment>

  <Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
      <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
      <Component Id="ProductComponent" Guid="5BB7300D-C29F-4C87-B461-AAE3AA4EB56D">
        <!--<File Source="$(var.SystemInformationService.TargetPath)" />-->
        <!--<CreateFolder/>-->
        <File Id="SystemInformationService" KeyPath="yes" Source="..\SystemInformationService\bin\Release\netcoreapp3.0\win-x86\SystemInformationService.exe"/>
        <ServiceInstall
          Id="ServiceInstaller"
          Type="ownProcess"
          Name="SystemInformationService"
          DisplayName="System Information Service"
          Description="System Information service by MyCompany"
          Start="auto"
          Account="LocalSystem"
          ErrorControl="normal" />
        <ServiceControl
          Id="ServiceInstaller"
          Start="install"
          Stop="both"
          Remove="uninstall"
          Name="SystemInformationService"
          Wait="yes" />
      </Component>
    </ComponentGroup>
  </Fragment>
</Wix>

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
  xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:key name="exe-search" match="wix:Component[contains(wix:File/@Source, 'SystemInformationService.exe')]" use="@Id" />

  <xsl:template match="wix:Component[key('exe-search', @Id)]" />
  <xsl:template match="wix:ComponentRef[key('exe-search', @Id)]" />

</xsl:stylesheet>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM