【问题标题】:Install .NET Core 3.0 Worker Service with WiX as Windows Service使用 WiX 作为 Windows 服务安装 .NET Core 3.0 Worker 服务
【发布时间】:2019-09-24 15:53:16
【问题描述】:

随着 .NET Core 3 的新版本,我正在尝试使用新的辅助服务模板创建一个 Windows 服务。我需要能够使用组策略安装它,而 WiX 似乎是这项工作的工具。

我已经创建了 .wxs 文件,并且没有指定 ServiceInstall 部分,它可以正常安装。

这是我的文件:已更新

<?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>

现在我正在尝试添加服务组件,以便在安装时启动。添加后运行安装程序时,安装程​​序 UI 挂在“正在启动服务...”上。我尝试添加“开始”参数,因为我在另一个答案中看到了这一点。

我在想,因为这是 .net 核心,我可能需要添加一个动作 .exe 或其他东西来启动服务。这就是我能想到的 - 任何建议都会有所帮助。

谢谢

更新:我已将 .wxs 文件更新为我现在拥有的文件,并且我已通过依赖于框架的部署正确安装它。我的问题是指定 AnyCPU 而不是 x86。但是...现在,当我切换到独立部署时,我遇到了与以前相同的错误。所以这一定与我发布 .net 核心的方式有关。

这是我目前的发布配置文件。当我切换到依赖框架时,安装程​​序运行良好并启动服务。

【问题讨论】:

  • 感谢 Stein,我发现如果我使用依赖于框架的框架,它可以在我的机器上运行(因为我显然安装了 .net 核心)但是当我切换到自包含时它再次失败(即使在我的机器)。
  • 我从未编写过 .net 核心 Windows 服务,因此可以归结为:.NET Core 是否真的像在 .NET 的 ServiceBase 中那样创建一个可以响应 ServiceStart ServiceStop 事件或它基本上只是作为工作人员运行的控制台应用程序吗?如果答案是后者,则需要使用 SrvAny 或 NSSM 之类的东西作为托管层。
  • 是的,克里斯,我也这么想。现在没时间看,但这里有一些链接供参考:Host ASP.NET Core in a Windows Service.NET Core application deployment
  • 你愿意尝试我的开源项目吗?遵循“windows 服务”教程,除了使用 .net 核心而不是 .net 框架来创建您的服务并查看它是否正常工作。根据您上次评论中的链接,我希望它应该这样做。 github.com/iswix-llc/iswix-tutorials

标签: c# .net-core wix


【解决方案1】:

想通了。我缺少的是必须在 .wxs 中的“ServiceInstall”和“ServiceControl”标签上方定义服务的 .exe。所以我需要做的是创建一个过滤器 .xslt 以从热生成的文件中过滤掉 .exe,然后在 ServiceInstall 上方的 Service 组件(keypath='yes')中添加一个标签。

下面是我的最终 .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>

【讨论】:

  • 您能分享一下您为此使用的 XSLT 吗?
  • @HariPachuveetil 抱歉回复晚了。我用过滤器更新了我的答案。
  • 我发现 another answer 有一个非常相似的 XSLT - 但谢谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
相关资源
最近更新 更多