Вместо того, чтобы условно включать открывающиеся элементы Directory
(что делает XML недействительным), условно задайте переменные препроцессора, которые используются в качестве имен каталогов, как говорится в комментарии @Daniel Pratt. Аналогично, наличие переменной «да / нет» в зависимости от платформы упрощает настройку 64-битных компонентов, поиск в реестре и т. Д.
Определение переменных
(С этот ответ )
<?if $(var.Platform) = x64 ?>
<?define ProductName = "Product Name (64 bit)" ?>
<?define Win64 = "yes" ?>
<?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
<?else ?>
<?define ProductName = "Product Name" ?>
<?define Win64 = "no" ?>
<?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
<?endif ?>
$(var.Platform)
встроен, но его значение используется для определения пользовательских переменных $(var.ProductName)
, $(var.Win64)
и $(var.PlatformProgramFilesFolder)
.
Использование переменных
Вы можете либо использовать директивы препроцессора <?if
для проверки значений переменных (как это делается с $(var.Platform)
при определении пользовательских переменных выше), либо иметь препроцессор, вставляющий значения переменных в атрибут XML или значения элементов. Пара примеров:
32/64-битные компоненты
<Component Id="..." Win64="$(var.Win64)">
...
</Component>
Это приведет к появлению предупреждений в редакторе Visual Studio WiX о том, что $(var.Win64)
не является одним из допустимых значений атрибута (yes
/ no
), но их можно безопасно игнорировать, поскольку препроцессор заменит соответствующее значение к тому времени, когда компилятор завладеет им.
32/64-битная папка Program Files
<Directory Id="$(var.PlatformProgramFilesFolder)">
...
</Directory>
Обновление для обработки отдельных 32/64-битных кодов продуктов
В ответ на комментарий rharrison33, спрашивающий, как обработать требование для различных кодов продуктов (или почти чего-либо) в 32- и 64-битных установщиках (при условии, что вы не можете / не хотите их автоматически генерировать):
- Передать отдельные коды продуктов в свечу в качестве переменных препроцессора, в командной строке или с помощью файла ответов:
candle <all other flags> -d ProductCode32=<guid1> -d ProductCode64=<guid2>
- Добавьте код продукта в качестве одной из зависимых от архитектуры переменных препроцессора и установите для него соответствующую входную переменную:
- В 32-битной
<?if ?>
ветви: <?define ProductCode = "$(var.ProductCode32)" ?>
- В 64-битной
<?if ?>
ветви: <?define ProductCode = "$(var.ProductCode64)" ?>
- См.
$(var.ProductCode)
в Product/@Id
.
Сделано это CW, потому что ссылка Даниэля отвечает на вопрос и, кроме того, содержит намного больше информации.