2010-04-30 3 views
4

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

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

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

Edit:

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

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

ответ

2

Ну, я думаю, что нашел решение случайно. После нескольких экспериментов я столкнулся с сообщением об ошибке из MSI, которое описывало некоторые столбцы для таблицы Feature в текущем сеансе, а также столбец RuntimeLevel, который не описан ни в одном из документов, которые я мог найти. Поэтому я пробовал это:

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

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

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

+0

Это документированы. Люди будут просто указывать и смеяться, если/когда установщик Windows изменит свою внутреннюю работу и сломает вас. –

+1

Может быть, но работать сейчас и ломать позже лучше, чем вообще не работать в этом случае. Выполнение поиска в Google показало, что кто-то сталкивался с тем же сообщением об ошибке с одинаковыми внутренними столбцами базы данных в 2005 году, поэтому я буду использовать свои шансы, что он не изменится в ближайшее время, если только до тех пор, пока я не найду лучшее решение или Microsoft делает WI более гибким. – Gerald

3

мне нужно сделать то же самое, и нашел, что это ...

Создать свойство .. который будет установлен ЦС или любой другой ...

<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> 

Примечания условия непосредственно установить доцент, установлено ли родитель, как с файлами и т.п., он устанавливает атрибут уровня на материнской функции. Установка его на 0 делает его скрытым ... вуаля!

2

В приведенном выше примере это правильный способ условно предложить функцию (за исключением того, рекомендуется, что условие должно быть в разделе CDATA), однако, так как вы сказали, что вы хотели, чтобы решить это в пользовательских действий ...

Учитывая особенность, как это:

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

В управляемом пользовательских действий вы получаете «Session» объект. Если вы хотите сделать эту функцию доступной для пользователя, установите для свойства INSTALLMYFEATURE значение «True», в противном случае установите значение «False».

session["INSTALLMYFEATURE"] = "True"; 

или

session["INSTALLMYFEATURE"] = "False";