片段中无法识别Wix安装程序UI

时间:2016-10-05 15:12:37

标签: user-interface wix 32bit-64bit wizard

我在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" />

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

如果我将这些元素移到Fragment下,我在安装时就没有向导。 我正在创建32位安装程序和64位安装程序。我希望尽量减少重复配置,因此希望将它放在Fragment中(在一个单独的wix库项目中)。

我同时做了很多更改,我认为这些更改没有争议,也开始从msiexec运行安装程序,因此没有注意到向导立即消失。如果必须从Product元素中引用,我本来期望wix报告我有未引用的ui元素?

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

1 个答案:

答案 0 :(得分:4)

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

这里发生的是你的UI是WixUI wixlib中嵌入WixUIExtension dll的片段集合的一部分。您可以看到WixUI_Mondo here的定义。您会注意到整个事情都在<Fragment>中,如果您深入查看对话框wxs文件,这些文件定义了引用的对话框,它们也是碎片。

当您向产品添加<UIRef Id="WixUI_Mondo" />时,您告诉预处理器将所有引用的内容引入主要产品的来源。

发生了什么事情,你把UIRef从你的产品中移出了一个片段。你现在没有任何东西将这个片段绑定到你的主产品中,所以它只是在构建过程中被丢弃,而最终的MSI没有来自wixUI_Mondo的任何东西。

如果要将所有共享的MSI XML放入一个很好的片段中。你可以在&#39;通过使用引用片段中<xxxxRef>元素的<xxxx>元素将该片段添加到主安装程序中。一个相当简单的方法是在片段中添加一个未使用的Property来定义该片段代表的内容。

<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>

因此,当您现在构建此项目时,预处理器基本上将PropertyRef替换为实际定义该属性的片段中的所有。如果您的片段中已经有属性或注册表搜索,则可以在产品中添加参考。

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