2011-08-11 112 views
0

WiX第一個計時器在這裏。WiX:有條件的內部文本沒有正確評估

我正在使用WiX構建我的產品的安裝程序,並且我正在嘗試驗證在繼續安裝之前安裝了MSMQ,並遵循this SO answer。我使用的是條件元素,這樣的定義:

<Condition Message="MSMQ must be installed in order to proceed."> 
    <![CDATA[MSMQ_INSTALLED<>"false"]]> 
    </Condition> 

我的房屋和RegistrySearch是這樣的:

<Property Id="MSMQ_INSTALLED" Value="false" Secure="yes"> 
    <RegistrySearch Id="Msmq.RS" 
        Root="HKLM" 
        Key="SOFTWARE\Microsoft\MSMQ" 
        Name="Values" 
        Type="raw"/> 
    </Property> 

但它從不計算正確。無論註冊表項是否存在,安裝都會停止並顯示消息。所以我的問題是:

  1. 我是否正確使用Condition元素?
  2. 我在評估中錯誤地定義了什麼?

在進一步測試中,我發現MSMQ_INSTALLED屬性包含值「1:0 2:」,無論我搜索的註冊表項是現有的還是假的。

編輯:Condition元素存在於Product元素中;這是一個重要的區別as the Condition element is overloaded

編輯:修改條件使用CDATA指令,並顛倒內部條件邏輯,以更準確地反映問題。

+0

不知道爲什麼這是downvoted - 給我留言,如果我可以澄清或消歧這篇文章。 – grefly

回答

1

那麼,答案was on SO the whole time。顯然,搜索註冊表項並不支持WiX開箱即用,因此我創建了一個自定義操作項目,並使用二進制標記將其導入到我的MSI中,然後在安裝過程中在適當的位置運行自定義操作。就我而言,這是在LaunchConditions之前。

僅供參考,代碼爲:(二進制到維克斯的進口,產品節點下)

public class CustomActions 
{ 
    [CustomAction] 
    public static ActionResult CustomAction1(Session session) 
    { 
     session.Log("Begin CustomAction1"); 

     var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\MSMQ"); 
     session["MSMQ_INSTALLED"] = key == null ? "-1" : "1"; 

     return ActionResult.Success; 

    } 
} 

(在自定義操作項目中唯一的類)

<Binary Id="WixCustomAction" SourceFile="C:\work\RelayMed\src\dev\WixCustomAction\bin\Debug\WixCustomAction.CA.dll"/> 
<CustomAction Id="CheckMsmq" BinaryKey="WixCustomAction" DllEntry="CustomAction1" Execute="immediate" Return="check"/> 

<InstallUISequence> 
    <Custom Action="CheckMsmq" 
      Before="LaunchConditions"/> 
</InstallUISequence> 

(LaunchConditions前自定義操作運行)

條件和財產保持原來的職位相同。 RegistrySearch已完全刪除。

編輯:注意到刪除了RegistrySearch標記。

0

您的創作者說「如果HKLM \ SOFTWARE \ Microsoft \ MSMQ @ Values的文字值爲'false',那麼安裝可以繼續。」

只需使用「MSMQ_INSTALLED」來檢查在註冊表值中找到的任何字符串。

+0

謝謝,只是在你發佈的時候修正了這個邏輯錯誤。 – grefly

+0

不幸的是,仍然是同樣的問題。 – grefly

+0

看到我上面的評論:只需使用「MSMQ_INSTALLED」來檢查在註冊表值中找到的任何字符串。 MSI將任何值視爲true。 –