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 源代码,了解他们如何使用大量片段组织所有内容。将所有紧密相关的东西打包成一个片段,然后用所有这些片段构建更大的东西。
我在 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 源代码,了解他们如何使用大量片段组织所有内容。将所有紧密相关的东西打包成一个片段,然后用所有这些片段构建更大的东西。