Элемент Wix XmlFile выполняется слишком рано

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

Я обнаружил, что могу просто использовать элемент util:XmlFile для изменения некоторых файлов, которые отличаются в зависимости от области установки, но проблема в том, что этот компонент запускается до того, как свойство будет изменено пользовательским интерфейсом. Вот фрагменты кода:

    <Property Id='ADXLoaderPrivileges' Value='bla' />
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Component Id="adxloader.dll.manifest" Guid="51FC65CB-BEAD-4423-A840-49C9CB22E191">
            <File Id="adxloader.dll.manifest" Source="$(var.ExcelProjectDir)\Loader\adxloader.dll.manifest" DiskId="1" KeyPath="yes" />
            <util:XmlFile Id="ModifyAdxLoaderManifest" Action="setValue"
                          ElementPath="/configuration/loaderSettings/@privileges" File="[TARGETDIR]\adxloader.dll.manifest" Value="[ADXLoaderPrivileges]" />
        </Component>
    </Directory>

    <Dialog Id='AllUsersChoice' X='50' Y='50' Width='373' Height='287' Title='[ProductName]' TrackDiskSpace='yes'>
       <Control Id='NextButton' Type='PushButton' X='300' Y='261' Width='66' Height='18' Text='{\VSI_MS_Sans_Serif13.0_0_0}&amp;Next &gt;' TabSkip='no' Default='yes'>
         <Publish Property='TARGETDIR' Value='[%ProgramFiles]\Manufacturer\ProductName\'><![CDATA[ALLUSERS=2]]></Publish>
         <Publish Property='TARGETDIR' Value='[%APPDATA]\Manufacturer\ProductName\'><![CDATA[ALLUSERS=1]]></Publish>
         <Publish Property='ADXLoaderPrivileges' Value='administrator'><![CDATA[ALLUSERS=2]]></Publish>
         <Publish Property='ADXLoaderPrivileges' Value='user'><![CDATA[ALLUSERS=1]]></Publish>
       </Control>
    </Dialog>

Файлы устанавливаются в папку на основе значения свойства ALLUSERS, но XmlFile выполняется со значением «bla» вместо «administrator» или «user».

Кроме того, как я могу указать пользовательские действия, которые будут выполняться на основе этого выбора?


person Vajda    schedule 22.10.2013    source источник
comment
Я думаю, что это может быть проблема масштаба. Попробуйте сделать свойство ADXLoaderPrivileges публичным, т.е. написать его заглавными буквами: ADXLOADERPRIVILEGES.   -  person BdN3504    schedule 22.10.2013
comment
Спасибо что решили проблему   -  person Vajda    schedule 22.10.2013
comment
@ BdN3504, сформулируйте свой ответ как ответ, чтобы автор мог его принять.   -  person Yan Sklyarenko    schedule 22.10.2013
comment
А как насчет второй проблемы с этими пользовательскими действиями? Должен ли я отредактировать свой вопрос или задать другой?   -  person Vajda    schedule 22.10.2013


Ответы (1)


Проблема связана с набором свойств, используемых установщиком. Если вы хотите, чтобы пользователь мог передать установщику свойство, доступное на этапе выполнения установки, вы должны сделать это свойство общедоступным. Сделать свойство общедоступным очень просто, вам просто нужно написать его ЗАГЛАВНЫМИ БУКВАМИ. В вашем случае вам нужно преобразовать ADXLoaderPrivileges в ADXLOADERPRIVILEGES.

Вторая ваша проблема тоже может быть решена довольно просто. Просмотрите базу данных установщика после того, как вы скомпилируете свой проект с помощью подходящей программы, такой как orca или instedit. Осмотрите таблицы InstallUISequence и InstallExecuteSequence. Здесь вы можете увидеть все стандартные и пользовательские действия. Порядок выполнения каждого действия определяется записью в столбце Sequence. Возможно, вы уже догадались: запись в столбце Condition определяет, выполняется ли действие вообще на основе перечисленных здесь условий.

Чтобы указать условие для CustomAction, используйте следующую ссылку:

  1. Определите условие, которое вы хотите оценить, в вашем случае это ADXLOADERPRIVILEGES.
  2. Напишите свое пользовательское действие
  3. Вставьте CustomAction в базу данных установщика. Вы можете сделать это двумя способами: либо создать элемент CustomAction, вложенный в элемент Product, либо вложить его в элемент Fragment. Если вы вложите его под Fragment, вы должны добавить элемент CustomActionRef к вашему элементу Product. Последнее правило применяется только в том случае, если вы не планируете свое CustomAction напрямую. Это тот случай, когда CustomAction запускается, например, нажатием кнопки в пользовательском интерфейсе.
  4. Запланируйте свое CustomAction. Создайте элементы Custom либо под элементами InstallUISequence, либо под элементами InstallExecuteSequence в вашем элементе Product. Атрибут Action элемента Custom — это имя CustomAction, указанное атрибутом Id в элементе CustomAction. Чтобы определить, когда выполняется CustomAction, используйте либо атрибут Sequence элемента Custom, который является абсолютным, либо используйте любой из атрибутов Before или After, в которых вы указываете имя другого действия (стандартного или пользовательского), которые являются относительными.
  5. Добавьте условие в свой CustomAction. Элемент Custom может иметь один дочерний элемент, который является текстовым представлением условия. Либо используйте обычный текст, либо вставьте свой текст в теги CDATA.

Вот некоторый код, в котором используются приведенные выше концепции:

Фрагмент CustomAction

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
    <Binary Id="AlterSqlStringTable.DLL" SourceFile="$(var.AlterSqlStringTable.TargetDir)AlterSqlStringTable.CA.dll" />
    <CustomAction Id="AlterSqlStringTable" BinaryKey="AlterSqlStringTable.DLL" DllEntry="AlterSqlStringTable" Execute="immediate" Return="check" />
    </Fragment>
</Wix>

Товар с элементом Custom:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="!(loc.Name)" Codepage="1252" Language="!(loc.Lang)" Version="YO.UR.VERS.ION" Manufacturer="!(loc.Manufacturer)" UpgradeCode="PUT-YOUR-GUID-HERE">
        ...
        <InstallExecuteSequence>
          <Custom Action="AlterSqlStringTable" Before="InstallFiles"><![CDATA[ADXLOADERPRIVILEGES = "administrator"]]></Custom>
        </InstallExecuteSequence>
        ...
    </Product>
</Wix>
person BdN3504    schedule 23.10.2013