How to install features depending on the value of property

前端 未结 1 1094
半阙折子戏
半阙折子戏 2020-12-19 08:57

I have a registry key that can be equal to one of two values: special value or null. And two features.

When my registry key equals to special

相关标签:
1条回答
  • 2020-12-19 09:32

    A common mistake is trying to control features through INSTALLLEVEL property. The install level should be static, you shouldn't change it during install.

    The INSTALLLEVEL value is considered a level above which features are no longer installed. For example, if INSTALLLEVEL = 5 a feature with Level 4 will be installed and a feature with Level 6 will not be installed.

    Through INSTALLLEVEL you can control the original feature state, for example:

    <Feature Id="MyFeatures" Level="4" ConfigurableDirectory='INSTALLLOCATION' Display='expand' AllowAdvertise='no'>
    
      <!-- Feature is not installed by default -->
      <Feature Id='First' Level='6' AllowAdvertise='no' ConfigurableDirectory='INSTALLLOCATION'/>
    
      <!-- Feature is installed by default -->
      <Feature Id="Second" Level="4" AllowAdvertise="no" ConfigurableDirectory="INSTALLLOCATION"/>    
    
    </Feature>
    

    For the above configuration you can then add install conditions by setting a Level lower or higher than INSTALLLEVEL:

    <Feature Id="MyFeatures" Level="4" ConfigurableDirectory='INSTALLLOCATION' Display='expand' AllowAdvertise='no'>
    
      <Feature Id='First' Level='6' AllowAdvertise='no' ConfigurableDirectory='INSTALLLOCATION'>
        <Condition Level="4">(MYTREAT="1") AND (SPECIALVALUE="special")</Condition>         
      </Feature>
    
      <Feature Id="Second" Level="4" AllowAdvertise="no" ConfigurableDirectory="INSTALLLOCATION">
        <Condition Level="6">(INSTALLLEVEL = 3) OR (MYTREAT="1" AND SPECIALVALUE)</Condition>
      </Feature>
    
    </Feature>
    

    As you can see, the feature Level attributes revolve around INSTALLLEVEL, not the other way around.

    Edit:

    Feature conditions are evaluated before any installation dialogs are shown. So you cannot condition a feature with a dialog control (for example a checkbox or a button).

    A solution would be to use a custom action which modifies the feature action based on your custom property. For example you can use MsiSetFeatureState function. You can find a custom action tutorial here: http://www.codeproject.com/KB/install/msicustomaction.aspx

    0 讨论(0)
提交回复
热议问题