2011-06-22 30 views
1

我如果正在安裝數據庫的功能,設置爲1的屬性:WIX的ServiceControl條件

<Property Id="DBFLAG" Value="0" /> 
<CustomAction Id="DbCheck" Return="check" Execute="immediate" Property="DBFLAG" Value="1" /> 
<InstallExecuteSequence> 
     <Custom Action="DbCheck" After="CostFinalize"><![CDATA[&ft_db=3]]></Custom> 
</InstallExecuteSequence> 

在另一個特徵我檢查這個DBFLAG,看它是否是0或1,基於這一點,我要立即或無法啓動服務:

<Component Id="cmp_Svc" Guid="99481212-F2E0-4B6E-934D-0994815C31ED"> 
      <File Id="FILE01" Source="$(var.Service.TargetDir)\Service.exe" KeyPath="yes" /> 

      <ServiceInstall Id="Svc" Name="My Service" Type="ownProcess" Account="[WIX_ACCOUNT_LOCALSYSTEM]" Description="My Service." DisplayName="My Service" ErrorControl="normal" Interactive="no" Start="auto" Vital="no" /> 
</Component> 
<Component Id="cmp_SvcC_Start" Guid="2ED5DBC7-BD42-4D46-AB18-E82DB0E317AD"> 
      <Condition>DBFLAG=1</Condition> 
      <ServiceControl Id="SvcC_Start" Name="My Service" Remove="uninstall" Stop="both" Wait="yes" Start="install" /> 
</Component> 

<Component Id="cmp_SvcC" Guid="5769A35B-FD61-45D4-8113-40FB762B79C6"> 
      <Condition>DBFLAG=0</Condition> 
      <ServiceControl Id="SvcC" Name="My Service" Remove="uninstall" Stop="both" Wait="yes" /> 
</Component> 

但是,如果安裝了數據庫功能,它通常運行的cmp_SvcC代替cmp_SvcC_Start服務。我檢查了日誌,可以看到在運行cmp_SvcC和cmp_SvcC_Start之前DBFLAG被設置爲1,但即使條件僅在DBFLAG = 0時仍然運行cmp_SvcC。

如果我將DBFLAG的初始值更改爲1,則會運行cmp_SvcC_Start。

有沒有人有任何想法,爲什麼會發生這種情況?

回答

2

它不這樣工作。即使您通過屬性間接地執行某項操作,也不能對某個組件進行條件限制。

正確的方法是在影響安裝的所有功能之間共享您的組件。這是通過FeatureComponents table完成的。

+0

你可以擴展一下嗎?我是wix的新手,我不太清楚你的意思。我是否將cmp_SvcC和cmp_SvcC_Start的添加到db功能? – knappster

+0

WiX不支持編輯FeatureComponents表。解決方案是使用Orca手動修改生成的MSI:http://msdn.microsoft.com/en-us/library/aa370557(VS.85).aspx。另一種解決方案是找到一個設置創作工具,它允許您修改此表。 –

+0

乾杯,知道這一點後,我不得不現在開始他們的代碼,因爲構建過程需要自動化,並且無法繼續編輯msi ... – knappster

1

另一種方法是在StartServices自定義操作本身上有條件。就像這樣:

<InstallExecuteSequence> 
<StartServices Sequence="5900"> 
    <![CDATA[VersionNT AND DBFLAG="1"]]> 
</StartServices> 
</InstallExecuteSequence> 

爲了得到你想要使用,與逆戟鯨打開微星,看InstallExecuteSequence表和排序後的順序號表什麼序列號的線索。