2016-10-05 46 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