Как условно исключить функции из FeaturesDlg в WiX 3.0 из управляемого настраиваемого действия (DTF)

Я пытаюсь собрать установщик, использующий WiX 3.0, и в одном я не уверен. Я хотел бы использовать диалоговое окно FeaturesDlg, чтобы пользователи могли выбирать функции для установки, но мне нужно иметь возможность условно исключить некоторые функции из списка на основе некоторого ранее полученного ввода, предпочтительно из управляемого настраиваемого действия.

Я вижу, что если я установлю атрибут Display для Feature на hidden в файле .wxs, он будет делать то, что я хочу, но я не могу найти способ изменить этот атрибут во время выполнения.

Любые указатели были бы замечательными.

Изменить:

Я попытался использовать SQL для обновления базы данных сеанса, но хотя я могу удалить эту функцию с помощью DELETE FROM Feature WHERE Feature = 'featureId', если я попытаюсь использовать UPDATE Feature SET Display=0 WHERE Feature='featureId', я получу UPDATE FAILED ошибку. Если я попытаюсь установить для Display значение, отличное от того, что оно уже установлено, я получаю эту ошибку.

Удаление функции ПОЧТИ достаточно хорошо, но мне нужно будет иметь возможность вернуться и повторно добавить функцию, если пользователь вернется и изменит некоторые входные данные.


person Gerald    schedule 30.04.2010    source источник


Ответы (3)


Думаю, я нашел решение случайно. После кучи экспериментов я наткнулся на сообщение об ошибке от MSI, в котором описаны некоторые столбцы для таблицы функций в текущем сеансе, и был столбец «RuntimeLevel», который не описан ни в каких документах, которые я смог найти. Итак, я попробовал это:

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

И это сработало; функция больше не была указана в SelectionTree. Затем я снова выполнил тот же запрос с RuntimeLevel = 1, и он снова появился в списке.

Поскольку я не уверен, есть ли какие-либо странные последствия для этого решения, я собираюсь оставить вопрос открытым на некоторое время, на всякий случай, если у кого-то есть «лучшее» решение.

person Gerald    schedule 01.05.2010
comment
Это недокументировано. Люди будут просто указывать пальцем и смеяться, если / когда установщик Windows изменит свою внутреннюю работу и сломает вас. - person Rob Mensching; 02.05.2010
comment
Может быть, но работать сейчас и ломать позже лучше, чем вообще не работать в этом случае. Выполнение поиска в Google обнаружило кого-то, кто сталкивался с тем же сообщением об ошибке с теми же самыми столбцами внутренней базы данных в 2005 году, поэтому я рискну, что это не изменится в ближайшее время, если / пока я не найду лучшее решение, или Microsoft делает WI более гибким. - person Gerald; 02.05.2010
comment
Это единственное рабочее решение, если условия являются динамическими (изменяются другим диалоговым окном установщика). Два других решения не работают. - person Rex Hui; 05.04.2021

Мне нужно было сделать то же самое и я нашел это ...

Создайте свойство .. которое будет установлено центром сертификации или чем-то еще ...

  <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 делает его скрытым ... вуаля!

person S Rosam    schedule 21.10.2010

Приведенный выше пример - это правильный способ условно предложить функцию (за исключением того, что рекомендуется, чтобы условие было в разделе 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";

or

session["INSTALLMYFEATURE"] = "False";
person Tom Faust    schedule 02.03.2011