4

WiX 3.0を使用してインストーラーを作成しようとしていますが、1つよくわかりません。ダイアログを使用して、ユーザーがインストールする機能を選択できるようにしたいFeaturesDlgのですが、以前に受け取った入力、できれば管理されたカスタムアクションに基づいて、リストから一部の機能を条件付きで除外できる必要があります。

Display.wxsファイルでaの属性を設定するFeaturehidden、必要な処理が実行されることがわかりますが、実行時にその属性を変更する方法がわかりません。

どんなポインタも素晴らしいでしょう。

編集

SQLを使用してセッションデータベースを更新しようとしましたが、実際にはを使用して機能を削除できますが、DELETE FROM Feature WHERE Feature = 'featureId'を使用しようとするとエラーが発生します。値をすでに設定されている値以外に設定しようとすると、そのエラーが発生します。UPDATE Feature SET Display=0 WHERE Feature='featureId'UPDATE FAILEDDisplay

機能を削除することで十分ですが、ユーザーが戻って入力データを変更した場合は、戻って機能を再度追加できるようにする必要があります。

4

3 に答える 3

3

さて、私は偶然に解決策を見つけたと思います。たくさんの実験の後、現在のセッションの機能テーブルのいくつかの列を説明しているMSIからのエラーメッセージに出くわしました。また、見つけたドキュメントに説明されていない列「RuntimeLevel」がありました。だから私はこれを試しました:

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

そしてそれはうまくいきました。この機能はSelectionTreeに表示されなくなりました。次に、RuntimeLevel = 1を使用して同じクエリを再度実行すると、リストが再度表示されました。

この解決策に奇妙な影響があるかどうかわからないので、他の誰かが「より良い」解決策を持っている場合に備えて、質問をしばらく開いたままにしておきます。

于 2010-05-01T08:02:19.150 に答える
3

私は同じことをする必要があり、これを見つけました...

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>

条件dosentは、親がファイルなどと同様にインストールされるかどうかを直接設定することに注意してください。これは、親機能のLevel属性を設定します。0に設定すると非表示になります...voilà!

于 2010-10-21T10:38:09.373 に答える
3

上記の例は、条件付きで機能を提供する正しい方法です(ただし、条件を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";
于 2011-03-02T04:07:05.290 に答える