Wix中的CustomAction未执行

7

我正在创建我的第一个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。不确定这是否存在问题,但还是想提一下。任何帮助将不胜感激。


请查看我的答案,它应该会对你有所帮助: https://dev59.com/nGIk5IYBdhLWcg3wbtyb#19274431 - Isaiah4110
2个回答

8

我终于得到了一个能够正常运作的东西。我的最初问题似乎是由于CustomAction没有加载,因为它位于不同的<fragment>中。我将所有代码合并到一个片段中,看起来就可以运行了。

在处理用户权限等问题后,我最终找到了这个解决方案:

<?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项目中。 - Sean B
你救了我的命,谢谢! ;) - Vico

0
1. 你是否要使用自定义操作来注册服务?你还必须处理卸载、修复操作。使用标准MSI功能安装服务更简单: http://wixtoolset.org/documentation/manual/v3/xsd/wix/serviceinstall.html 2. 如果你想为此目的使用自定义操作,并且启用了UAC,则由于权限问题,你的服务将无法安装。你必须使用延迟和非模拟的自定义操作,在InstallFinalize之前计划(在InstallFinalize之后,不能计划自定义操作)。

是的,我正在通过CustomAction安装服务。我没有使用Wix中的标准服务安装程序,因为它不是标准服务。我正在使用一个名为Topshelf(http://topshelf-project.com/)的框架。此外,我计划处理卸载和修复,但首先...我需要安装服务。 - Cole W
我们还使用Topshelf来管理我们的服务,这并不会与使用标准MSI功能相矛盾。如果您的服务在安装过程中需要执行特定操作,可以在第一次启动时完成。 - leshy84
这很有趣,因为我在网上阅读的大多数涉及安装Topshelf服务的文章都建议使用CustomActions。我看过一篇文章说要像创建普通Windows服务一样创建Installer类,但那时我就会质疑为什么我要使用Topshelf。所以你是要创建这个安装程序类来利用Wix中的标准功能吗? - Cole W
3
Wix可以用来安装Topshelf服务。你只需要确保Wix文件中的服务名称与调用Topshelf的SetServiceName()时的服务名称完全匹配即可。 - Vasily Redkin
@VastlyRedskin 如果你已经让它工作了,为什么不发布一个简单的示例,包括Topshelf设置代码和Wix源代码呢? - Peter
@Peter 如果还有人在疑惑,这对我有效: 假设您的wix配置中有以下内容:<ServiceInstall Id="SeviceInstall" Name="AwesomeService" Type="ownProcess" Start="auto" Account="LocalSystem" ErrorControl="normal"> </ServiceInstall>然后在您的topshelf中,服务名称必须完全相同:configure.SetServiceName("AwesomeService"); - Daan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接