Wix中的CustomAction未执行

Wix中的CustomAction未执行,wix,topshelf,wix3.8,Wix,Topshelf,Wix3.8,因此,我正在创建我的第一个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" V

因此,我正在创建我的第一个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>
需要注意的一点是,exe实际上来自上面定义的组件groupref。我不确定这是否是个问题,但我想我应该提一下。任何帮助都将不胜感激

  • 是否要使用自定义操作注册服务? 您还必须处理卸载、修复操作。 使用标准MSI功能安装服务要简单得多:

  • 如果您希望为此目的使用自定义操作,并且UAC已启用,则由于权限原因,将不会安装您的服务。 您必须在InstallFinalize之前使用延迟的、非模拟的自定义操作(在InstallFinalize之后,无法计划自定义操作)


  • 我终于找到了有效的方法。CustomAction未加载的最初问题似乎是由于它位于不同的
    中。我将所有代码整合到一个片段中,它似乎正在运行

    在与用户权限等进行斗争后,我最终得出了以下解决方案:

    <?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>
    
    
    未安装
    (不升级ProductCode)和(REMOVE=“ALL”)
    
    在这里检查我的答案,它应该会帮助您:是的,我正在通过CustomAction安装服务。我没有在Wix中使用标准服务安装,因为它不是标准服务。我正在使用一个名为Topshelf()的框架。此外,我确实计划处理卸载和修复,但首先要做的是。。。我需要安装服务。我们的服务也使用Topshelf,这与使用标准MSI功能并不矛盾。如果您的服务在安装过程中执行特定操作,您可以在第一次启动时执行。这很有趣,因为我在网上阅读的大多数有关安装Topshelf服务的文章都建议使用CustomActions来执行此操作。我看过一篇文章,上面说要创建一个类似于普通windows服务的安装程序类,但在这一点上,我甚至质疑我为什么要使用Topshelf。那么,您创建这个安装程序类是为了能够利用Wix中的标准功能吗?Wix可用于安装topshelf服务。您只需确保wix文件中的服务名称与调用topshelf的SetServiceName()时的服务名称完全匹配。@VastlyRedskin如果可以使用,为什么不发布一个包含topshelft安装代码和wix源代码的简单示例?您还可以通过:execomand=“[INSTALLFOLDER]进一步将service.exe的名称与wix代码解耦$(var.YourServiceProjectName.TargetName)install“假设您已将该项目添加为对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>
    
          <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>