【问题标题】:CustomAction in Wix not executingWix 中的 CustomAction 未执行
【发布时间】:2014-01-17 19:37:23
【问题描述】:

所以我正在创建我的第一个 Wix 项目,但我似乎在执行自定义操作时遇到了问题。我不确定它是否包含在 msi 中,我不太确定我做错了什么。以下是我的 Wix 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="ExactaDynamicManifest" Language="1033" Version="1.0.0.0" Manufacturer="Bastian Software Solutions" UpgradeCode="274ff2d9-e291-4706-a8db-ce80ccd91538">
      <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine"/>

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

      <Feature Id="ProductFeature" Title="ExactaDynamicManifest" Level="1">
        <ComponentGroupRef Id="ExactaDynamicManifest"/>
      </Feature>

      <Icon Id="exacta.ico" SourceFile="icons\exacta.ico"/>
      <Property Id="ARPPRODUCTICON" Value="exacta.ico" />

    </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
        <Directory Id="ExactaFolder" Name ="Exacta">
                  <Directory Id="INSTALLFOLDER" Name="ExactaExactaDynamicManifest" />
        </Directory>
            </Directory>
        </Directory>
    </Fragment>

    <Fragment>
      <CustomAction Id="InstallService" FileKey="ExactaDynamicManifest.exe" ExeCommand="install"/>
      <InstallExecuteSequence>
        <Custom Action="InstallService" After="InstallFinalize"/>
      </InstallExecuteSequence>
    </Fragment>
</Wix>

最后一个片段包含我的自定义操作,我希望在所有文件都放入目录后在命令行上执行以下操作:

ExactaDynamicManifest.exe install

需要注意的一点是,exe 实际上来自上面定义的 ComponentGroupRef。不确定这是否是一个问题,但我想我会提到它。任何帮助将不胜感激。

【问题讨论】:

标签: wix topshelf wix3.8


【解决方案1】:

我终于得到了一些有用的东西。我最初的 CustomAction 未加载问题似乎是由于它位于不同的&lt;fragment&gt; 中。我将所有代码合并为一个片段,它似乎可以运行。

在与用户权限等斗争后,我最终得到了这个解决方案:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="ExactaDynamicManifest" Language="1033" Version="1.0.0.0" Manufacturer="Bastian Software Solutions" UpgradeCode="274ff2d9-e291-4706-a8db-ce80ccd91538">
      <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine"/>

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

      <Feature Id="ProductFeature" Title="ExactaDynamicManifest" Level="1">
        <ComponentGroupRef Id="ExactaDynamicManifest"/>
      </Feature>

      <Icon Id="exacta.ico" SourceFile="icons\exacta.ico"/>
      <Property Id="ARPPRODUCTICON" Value="exacta.ico" />

    </Product>

    <Fragment>
      <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="ProgramFilesFolder">
          <Directory Id="ExactaFolder" Name ="Exacta">
            <Directory Id="INSTALLFOLDER" Name="ExactaExactaDynamicManifest" />
          </Directory>
        </Directory>
      </Directory>

      <CustomAction Id="RunTopShelfServiceInstall" Directory="INSTALLFOLDER" Execute="deferred" Return="ignore" Impersonate="no" ExeCommand="[INSTALLFOLDER]ExactaDynamicManifest.exe install"/>
      <CustomAction Id="RunTopShelfServiceUninstall" Directory="INSTALLFOLDER" Execute="deferred" Return="ignore" Impersonate="no" ExeCommand="[INSTALLFOLDER]ExactaDynamicManifest.exe uninstall"/>

      <InstallExecuteSequence>
        <Custom Action="RunTopShelfServiceInstall" After="InstallFiles">
          NOT Installed
        </Custom>
        <Custom Action="RunTopShelfServiceUninstall" After='InstallInitialize'>
          (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
        </Custom>
      </InstallExecuteSequence>

    </Fragment>
</Wix>

【讨论】:

  • 您还可以通过以下方式进一步将您的 service.exe 的名称与您的 wix 代码分离: ExeCommand="[INSTALLFOLDER]$(var.YourServiceProjectName.TargetName) install" 假设您已添加项目作为参考你的 wix 项目。
【解决方案2】:
  1. 您要使用自定义操作注册服务吗? 您还必须处理卸载、修复操作。 使用标准 MSI 功能安装服务要简单得多: http://wixtoolset.org/documentation/manual/v3/xsd/wix/serviceinstall.html

  2. 如果您想为此目的使用自定义操作并且启用了 UAC,您的服务将因权限问题而不会安装。 您必须使用在 InstallFinalize 之前安排的延迟且未模拟的自定义操作(在 InstallFinalize 自定义操作之后无法安排)。

【讨论】:

  • 是的,我正在通过 CustomAction 安装服务。我没有使用 Wix 中的标准服务安装,因为它不是标准服务。我正在使用一个名为 Topshelf (topshelf-project.com) 的框架。此外,我确实计划处理卸载和修复,但首先...我需要安装该服务。
  • 我们的服务也使用 Topshelf,这与使用标准 MSI 功能并不矛盾。如果你的服务在安装过程中做了一些特定的事情,你可以在第一次启动时做。
  • 这很有趣,因为我在网上阅读的大多数关于安装 Topshelf 服务的文章都建议使用 CustomActions 来执行此操作。我看过一篇文章说创建一个像普通 Windows 服务一样的安装程序类,但那时我质疑为什么我什至使用 Topshelf。那么,您是否正在创建这个安装程序类以便能够利用 Wix 中的标准功能?
  • Wix 可用于安装 topshelf 服务。您只需确保 wix 文件中的服务名称完全与调用 topshelf 的 SetServiceName() 的服务名称匹配。
  • @VastlyRedskin 如果您可以使用它,为什么不发布一个包含 topshelf 设置代码和 wix 源代码的简单示例?
猜你喜欢
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
相关资源
最近更新 更多