2016-10-05 44 views
1

不承认我已经Product元素维克斯安装程序UI在片段

<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位安装程序。我期待最大限度地减少重复配置,因此希望将它放入Fragment(在单独的wix库项目中)。

我做在同一时间相当多的变化,我认为是没有争议的,也开始运行,从MSIEXEC安装程序,所以没有注意到向导立即消失。如果需要从Product元素引用它,我会期望wix报告我有未引用的UI元素吗?

如何,最好尽量减少与32位/ 64位产品项目共享的威克斯库的UI规范呢?

感谢 马丁

回答

4

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

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

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

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

如果你想把所有共享的MSI XML放入一个很好的片段中。您可以使用片段中引用<xxxx>元素的<xxxxRef>元素将该片段“绑定”到主安装程序。一个相当简单的方法就是将一个未使用的属性添加到定义该片段代表的片段中。

<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与一切在该属性实际定义的片段。如果您的片段中已经有属性或注册表搜索,则可以将ref添加到您的产品中。

你只需要引用片段中的一件事物来引入整个片段。您可以花一些时间浏览wix源文件,看看它们是如何使用大量片段来组织所有内容的。将所有紧密相关的东西装入一个片段,然后用所有这些片段构建更大的东西

+0

哇,谢谢布赖恩 - 一个非常全面的答案。我没有想到这就是片段的工作原理,但现在你说出来是有道理的。 –

+0

FireGiant的文档应该改进。当我将大型安装程序分解为一个大小的块时,这一个细节会导致整个自定义UI消失。 – user922020