INSTALLLEVEL не устанавливает функцию - PullRequest
1 голос
/ 10 декабря 2011

У меня есть две функции:

    <Feature Id='BaseProductFeatures' Title='Feature 1' Level='1'>
        <ComponentRef Id='WebAppVDirComponent'/>
        <ComponentRef Id='someVDirComponent'/>
        <ComponentRef Id='anotherWCFVDirComponent'/>
        <ComponentGroupRef Id='group_IMPORTFOLDERFILES'/>
        <ComponentGroupRef Id='group_WINSERVERFILES'/>
    </Feature>

    <Feature Id='SMSGWFeature' Title='Feature 2' Level='2'>
        <ComponentGroupRef Id='group_SMSGWWEBAPPFILES'/>
    </Feature>

Перед установкой я изменяю INSTALLLEVEL на 2, используя пользовательское действие:

    [CustomAction]
    public static ActionResult ChangeInstallLevel(Session session) {
        session["INSTALLLEVEL"] = "2";
        return ActionResult.Success;
    }

Значение устанавливается, но функция 2 (SMSGWFeature) не устанавливается. Это почему? Я не вижу ни одного из Компонентов в ComponentGroupRef, group_SMSGWWEBAPPFILES, устанавливается в каталог, в котором я ожидал бы увидеть их. Но установщик будет работать, если я установлю Уровень Функции 2 (SMSGWFeature) равным 1.

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Убедитесь, что ваше пользовательское действие выполнено до InstallValidate действие в InstallExecuteSequence .Установка INSTALLLEVEL после InstallValidate ни на что не влияет.

Кроме того, подробный журнал установки очень помогает определить, почему компонент или компонент не установлен и почему.Просто найдите InstallValidate в журнале, проверьте состояние компонента и компонента и установите действия.

0 голосов
/ 12 декабря 2011

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

Применительно к этой ссылке слишком поздно менять INSTALLLEVEL из пользовательского интерфейса, потому что INSTALLLEVEL принимается заучетной записи в соответствии со стандартным действием CostFinalize, и стандартное действие CostFinalize будет выполнено до того, как у меня будет время, чтобы позволить пользователю выбрать его функции и вызвать мое действие.Космин, я не думаю, что INSTALLLEVEL имеет значение до InstallValidate, кажется, что это гораздо раньше, в этом случае его до CostFinalize учитывают.

То, что я должен был сделать, было следующим...

Я изменил свою вторую функцию, чтобы она отсутствовала:

<Feature Id='BaseProductFeatures' Title='Feature 1' Level='1'>
    <ComponentRef Id='WebAppVDirComponent'/>
    <ComponentRef Id='someVDirComponent'/>
    <ComponentRef Id='anotherWCFVDirComponent'/>
    <ComponentGroupRef Id='group_IMPORTFOLDERFILES'/>
    <ComponentGroupRef Id='group_WINSERVERFILES'/>
</Feature>

<Feature Id='SMSGWFeature' Title='Feature 2' Level='2' Absent='allow'>
    <ComponentGroupRef Id='group_SMSGWWEBAPPFILES'/>
</Feature>

Я изменил свое пользовательское действие, чтобы включить или отключить функцию:

foreach (FeatureInfo aFeature in session.Features) {
    if (session["INSTALLSMSGATEWAYSERVICE"] == "" && aFeature.Name == "SMSGWFeature") {
        aFeature.RequestState = Microsoft.Deployment.WindowsInstaller.InstallState.Absent;
    }
    else if (session["INSTALLSMSGATEWAYSERVICE"] == "1" && aFeature.Name == "SMSGWFeature") {
        aFeature.RequestState = Microsoft.Deployment.WindowsInstaller.InstallState.Local;
    }
}
...