2015-07-06 68 views
1

在我的Managed Bootstrapper中,我試圖調用Engine.EvaluateCondition(「MY_PROG_FOUND」);在Run()方法中。但它從來沒有評估過,並說:「這需要一個正在運行的線程。」它從不評估。wix託管引導程序:Engine.EvaluateCondition()需要單獨的線程?

我試圖評估我的託管引導程序中的捆綁條件,但仍然沒有運氣。

MY_PROG_FOUND被捆綁代碼中定義:

<util:RegistrySearch Id="PETRELINSTALLLOCATION" 
     Variable="MY_PROG_FOUND"      
     Root="HKLM" 
     Key="SYSTEM\CurrentControlSet\Control\Session Manager\Environment"  
     Value="$(var.my_prog_env_var)" 
     Result="exists" 
    /> 

    <bal:Condition Message="[WixBundleName] required the installation of My Program."> 
     <![CDATA[Installed OR (MY_PROG_FOUND)]]> 
    </bal:Condition> 

我如何在管理引導程序使用Engine.EvaluateCondition()?這是否需要在特定事件中調用,如DetectBegin()?

任何幫助將非常感謝... 感謝一堆。

回答

3

後來我發現單獨的線程在事件調用期間處於活動狀態。所以我在DetectComplete事件中嘗試了它,併發揮作用。


但在此之前,我必須解析BootstrapperApplicationData.xml文件以獲得WixBalCondition元素並將集合獲取到數組中,例如BalConditions []。

這裏是我的代碼片段:

void BootstrapperApplication_DetectComplete(object sender, DetectCompleteEventArgs e) 
      { 
       string balCondtionMessages = string.Empty; 
       bool balConditionStatus = true; 
       foreach (var balCondition in bootAppData.BundleData.BalConditions) 
       { 
        if (!model.BootstrapperApplication.Engine.EvaluateCondition(balCondition.Condition)) 
        { 
         balConditionStatus = false; 
         if (!String.IsNullOrEmpty(balCondtionMessages)) 
         { 
          balCondtionMessages = balCondtionMessages + '\n' + "- " + balCondition.Message; 
         } 
         else 
          balCondtionMessages = "- " + balCondition.Message; 
        } 


       } 

       if (!balConditionStatus) 
       { 
       SetbalConditionMsg(balCondtionMessages); 
       }  
     } 

這讓我們解析在我們Bundle.wxs代碼的所有條件,對其進行評估,並顯示在我們的自定義用戶界面引導程序的相關消息。

相關問題