为啥我的 Wix 安装程序中缺少我的 CustomTable?

Posted

技术标签:

【中文标题】为啥我的 Wix 安装程序中缺少我的 CustomTable?【英文标题】:Why is my CustomTable missing from my Wix installer?为什么我的 Wix 安装程序中缺少我的 CustomTable? 【发布时间】:2013-07-29 11:02:50 【问题描述】:

我有一个数据驱动的自定义操作,我将它与表格数据一起定义在它自己的文件中。当我运行我的安装时,它失败了,因为缺少自定义表(我已经检查过 Orca,它不存在)。

我意识到需要以某种方式引用该片段,并且我已经注意到问题10339055 和6344608 中的建议。

按照6344608 中的建议,我将自定义操作定义移动到与表数据相同的片段中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <?include $(sys.CURRENTDIR)\Config.wxi?>

  <Fragment>
    <CustomTable Id="AscomDeviceProfiles">
      <Column Id="ProgId" Type="string" PrimaryKey="yes" Category="Text" />
      <Column Id="ChooserName" Type="string" />

      <Row>
        <Data Column="ProgId">ASCOM.Driver.Type</Data>
        <Data Column="ChooserName">$(var.InstallName)</Data>
      </Row>

    </CustomTable>

    <!-- Define the custom actions that will process the above table data -->
    <Binary Id="binRegAscomDeviceProfiles" SourceFile="$(var.Wix.RegisterAscomDeviceProfiles.TargetDir)\$(var.Wix.RegisterAscomDeviceProfiles.TargetName).CA.dll" />
    <!-- Register and check the return code - must run as "immediate" in order to access session data -->
    <CustomAction Id="caRegisterAscomDeviceProfiles" BinaryKey="binRegAscomDeviceProfiles" DllEntry="RegisterAscomDeviceProfiles" Execute="immediate" Return="check" />
    <!-- Unregister and ignore return code (allows uninstall to succeed even if ASCOM is broken) -->
    <CustomAction Id="caUnregisterAscomDeviceProfiles" BinaryKey="binRegAscomDeviceProfiles" DllEntry="UnregisterAscomDeviceProfiles" Execute="immediate" Return="ignore" />

  </Fragment>
</Wix>

在我的Product.wxs 文件中,我通过调度来引用自定义操作,如下所示:

<InstallExecuteSequence>
  <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWERPRODUCTFOUND AND NOT Installed</Custom>
  <RemoveExistingProducts Before='InstallInitialize' />
  <!-- Elevate to admin if required -->
  <Custom Action='IsPrivileged' Before='LaunchConditions'>Not Privileged</Custom>
  <!-- Create ASCOM device profiles during install finalize phase, but not if already installed -->
  <Custom Action="caRegisterAscomDeviceProfiles" Before="InstallFinalize">NOT Installed</Custom>
  <!-- Remove ASCOM device profiles during uninstall (but not maintenance mode) -->
  <Custom Action="caUnregisterAscomDeviceProfiles" Before="RemoveFiles">REMOVE ~= "ALL"</Custom>
</InstallExecuteSequence>

这会正确引入自定义操作,并在输出 MSI 文件中创建二进制文件,InstallExecuteSequence 条目也是如此:

但自定义表无处可见。我确定我遗漏了一些明显的东西,但我看不出它是什么。可以吗?

【问题讨论】:

为您的自定义表格添加 EnsureTable 元素:***.com/questions/461907/… 根据 Rob Mensching 对其中一个链接问题的回答,这不是必需的(从上面的源代码中可以看出,该表绝对不是空的)。但是,我认为我可能遇到了导致输出未更新的构建问题,因此我可能只是在查看旧输出。当我知道更多时,我会发布更新。 糟糕,我似乎在彻底阅读文本之前就发表了评论...抱歉。 【参考方案1】:

我发现了问题。 Wix 源代码没有任何问题,存在阻止正确重建输出的构建问题。

我想要做的就是删除这个问题,因为它确实是一个红鲱鱼。我不确定是否删除它,所以我将它留给社区。如果有人想投票删除它,我不反对。

【讨论】:

只有一个建议。您可能需要考虑创建一个名为 Component_ 的附加列,并在您的自定义操作中使用 MsiEvaluateCondition 函数,而不是在序列表中放置诸如 Not Installed / REMOVE~="ALL" 之类的条件。这就是 Windows Installer 标准操作的工作方式。

以上是关于为啥我的 Wix 安装程序中缺少我的 CustomTable?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 FileSearch 元素的 MinVersion 属性在我的 WiX 安装程序中不起作用?

WIX安装程序无法正确显示WixUI对话框的自定义图像

Wix 自定义卸载操作 - 如何在 msi 删除文件之前运行

Wix - 在安装/升级期间,自定义操作的条件在不应该的情况下解析为False

WIX安装项目未完全卸载应用程序

如何设置 Wix 引导程序安装的产品代码