Fragment 无法识别 Wix 安装程序 UI

Wix installer UI not recognised in Fragment

我在 Product 元素中有以下元素

  <Fragment>
  <UI />
  <UIRef Id="WixUI_Mondo" />
  <!--<PropertyRef Id="WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED" />
      <Condition Message="This application requires .NET Framework 4.6.1 or later">Installed OR WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED</Condition>-->
  <Icon Id="DesktopIcon.exe" SourceFile="MyApplication.exe" />

我在安装时得到了预期的向导行为。

如果我将这些元素移到片段下,则在安装时不会出现向导。 我正在创建一个 32 位安装程序和一个 64 位安装程序。我希望尽量减少重复配置,因此希望将其放入片段中(在单独的 wix 库项目中)。

我同时进行了 quite 一些我认为没有争议的更改,并且还启动了 运行 来自 msiexec 的安装程序,所以没有注意到向导立即消失了。如果必须从 Product 元素引用它们,我会期望 wix 报告我有未引用的 ui 元素?

如何最好地减少与 32 bit/64 位产品项目共享的 wix 库的 ui 规范?

这是因为 <Fragments> 应该如何工作。当您构建安装程序项目时,您首先对整个项目进行预处理以构建一些目标文件。在构建这些目标文件时,如果您引用了片段中的某些内容,则整个片段都会被带入源代码中。如果片段中没有引用最终关联到您的 msi 产品的内容,则该片段将被丢弃并从对象文件中删除。

这里发生的是你的 UI 是 WixUIwixlib 中的片段集合的一部分,它嵌入在 WixUIExtension dll 中。你可以看到WixUI_Mondohere的定义。您会注意到整个内容都在一个 <Fragment> 中,如果您深入了解定义所引用对话框的对话框 wxs 文件,它们也在片段中。

当您将 <UIRef Id="WixUI_Mondo" /> 添加到您的产品时,您是在告诉预处理器将所有引用的内容引入主产品的源代码中。

您将 UIRef 从您的产品中移到了片段中。你现在没有将该片段绑定到你的主要产品中,所以它只是在构建过程中被丢弃,最终的 MSI 中没有任何来自 wixUI_Mondo 的内容。

如果您想将所有共享 MSI XML 放入一个片段中,那很好。您可以通过使用引用片段中 <xxxx> 元素的 <xxxxRef> 元素,将该片段 'tie in' 到您的主安装程序。一个相当简单的方法是在你的片段中添加一个未使用的 属性 来定义该片段代表什么。

<Fragment>
  <Property Id="SharedInstaller" Hidden="true"/>

  <UIRef Id="WixUI_Mondo"/>
  <!-- lots of other shared installer stuff here -->
</Fragment>

并且在您要使用此共享 xml 的安装程序中,您可以使用

<Product Id="..." ... >
   <PropertyRef Id="SharedInstaller"/>

   <!-- more installer stuff unique to this version of the installer -->
</Product>

所以当你现在构建这个项目时,预处理器基本上用 everything 替换了 属性Ref 在片段中 属性 实际上是定义。如果您的片段中已经有 属性 或 registrysearch,您可以将其添加到您的产品中。

你只需要引用一个片段中的一个东西就可以引入整个片段。您可以花一些时间查看 wix 源代码,了解他们如何使用大量片段组织所有内容。将所有紧密相关的东西打包成一个片段,然后用所有这些片段构建更大的东西。