代码之家  ›  专栏  ›  技术社区  ›  Gerald

如何从托管自定义操作(DTF)中有条件地排除WIX 3.0中“FeaturesDlg”的功能

  •  4
  • Gerald  · 技术社区  · 14 年前

    我试图用wix 3.0组装一个安装程序,但我对其中一件事不确定。我想用 FeaturesDlg 对话框允许用户选择要安装的功能,但我需要能够根据以前收到的某些输入(最好是从托管自定义操作)有条件地从列表中排除某些功能。

    我知道如果我把 Display A的属性 Feature hidden 在.wxs文件中,它执行我想要的操作,但我无法找到在运行时更改该属性的方法。

    任何一个指针都是很好的。

    编辑 :

    我尝试使用SQL更新会话数据库,但实际上可以使用 DELETE FROM Feature WHERE Feature = 'featureId' ,如果我尝试使用 UPDATE Feature SET Display=0 WHERE Feature='featureId' 我得到了一个 UPDATE FAILED 错误。如果我试图设置 显示 除了它已经设置的值以外的其他值,我会得到这个错误。

    删除这个特性几乎已经足够好了,但是如果用户返回并更改一些输入数据,我需要能够返回并重新添加这个特性。

    3 回复  |  直到 14 年前
        1
  •  3
  •   S Rosam    14 年前

    我也要这么做,然后发现…

    创建属性..这将由CA或其他什么设置…

      <Property Id='INSTALL_FEATURE_2'>YES</Property>
    

    然后使用功能内的属性…

      <Feature Id='ASecondFeature' Title='Feature 2' Level='1'>
        <Condition Level='0'>INSTALL_FEATURE_2 = "NO"</Condition>
        <ComponentGroupRef Id='secondComponent'/>  
      </Feature>
    

    注意Condition dosent直接设置父级是否与文件等一起安装,它在父级功能上设置level属性。将其设置为0将使其隐藏…Voice!

        2
  •  2
  •   Gerald    14 年前

    我想我是偶然找到了解决办法。经过一系列的试验,我遇到了一条来自msi的错误消息,它有点描述了当前会话中功能表的一些列,还有一个列“runtimelevel”,它在我能找到的任何文档中都没有描述。所以我试了一下:

    session.Database.Execute("UPDATE Feature SET RuntimeLevel=0 WHERE Feature='MyFeature'");
    

    而且它工作了;这个特性不再列在SelectionTree中。然后我再次运行了runtimelevel=1的相同查询,它再次被列出。

    因为我不确定这个解决方案是否有任何奇怪的含义,所以我将把这个问题保留一段时间,以防其他人有更好的解决方案。

        3
  •  2
  •   Tom Faust    13 年前

    上面的例子是有条件地提供一个特性的正确方法(除了它建议条件应该在一个CDATA部分中),但是,因为您在自定义操作中说过要决定这一点…

    提供这样的功能:

    <Feature Id="MyFeature" Title="My Title" Level="1" >
      <Condition Level="0"><![CDATA[NOT(INSTALLMYFEATURE~="TRUE")]]></Condition>
      <ComponentGroupRef Id="MyFeatureComponentGroup" />
    </Feature>
    

    在托管自定义操作中,您将收到一个“会话”对象。如果要使该功能对用户可用,请将InstallMyFeature属性设置为“true”,否则将其设置为“false”。

    session["INSTALLMYFEATURE"] = "True";
    

    session["INSTALLMYFEATURE"] = "False";