Создание инсталлятора с помощью WiX / Хабр
Для начала — что такое WiX? Технология WiX (Windows Installer XML) представляет собой набор инструментов и спецификаций упрощающих процесс создания дистрибутивов на базе MSI (Microsoft Installer). Если объяснять проще то это обертка вокруг MSI с человеческим лицом.
На мой взгляд изучать проще всего на простых примерах. В данной статье я приведу пример простейшего инсталлятора.
Для начала поставим условия задачи — необходимо создать установочный дистрибутив, который будет содержать следующие диалоги:
Приветствие
Лицензионное соглашение
Выбор директории
Начало установки
Для создания дистрибутива нам понадобится сам WiX, последнюю версию которого всегда можно скачать на Source Forge. На данный момент последняя версия 3.5.0828.0.
Необходимо скачать и установить:
1. ProjectAggregator2.msi — нужен, для того, чтобы установить Votive (находится внутри дистрибутива номер 2).
2. Wix35.msi или Wix35_x64.msi (в зависимости от платформы)
3. Русский языковой файл
Итак, скачали, установили, запускаем Visual Studio. Меню File -> New Project, если все установлено правильно — появился новый раздел Windows Installer XML. Выбираем шаблон проекта Setup Project, вводим название проекта (я оставил как есть SetupProject1).
Проект будет состоять из одного файла Product.wxs с ним мы и будем работать. В моем случае файл выглядел следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Name="SetupProject1" Language="1033" Version="1.0.0.0" Manufacturer="SetupProject1" UpgradeCode="06a81104-1e30-463d-87e1-e8a79b4c682a">
<Package InstallerVersion="200" Compressed="yes" /> <Media Cabinet="media1.
cab" EmbedCab="yes" />
<Directory Name="SourceDir">
<Directory>
<Directory Name="SetupProject1">
<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
<!-- <Component Guid="b11556a2-e066-4393-af5c-9c9210187eb2"> -->
<!-- TODO: Insert files, registry keys, and other resources here. -->
<!-- </Component> -->
</Directory>
</Directory>
</Directory> <Feature Title="SetupProject1" Level="1">
<!-- TODO: Remove the comments around this ComponentRef element and the Component above in order to add resources to this installer. -->
<!-- <ComponentRef /> -->
</Feature>
</Product>
</Wix>* This source code was highlighted with Source Code Highlighter.
Для начала настроим внешний вид и добавим поддержку русского языка.
Начнем с добавления русского языка. Для этого:
1. В ключе Product изменяем 1033 на 1049
2. В свойствах проекта (правой клавишей по названию проекта в Solution Explorer -> Properties), закладка Build, в поле Cultures to build вставляем ru-RU
3. Добавляем к проекту (правой клавишей по названию проекта в Solution Explorer -> Add -> Existing Item
В сгенерированном проекте нет ни одного диалогового окна. Существуют два варинта добавления диалоговых окон — создавать самостоятельно, либо воспользоваться готовым набором диалоговых окон.
Мы пойдем вторым путем, начинать знакомство лучше с простого. Для этого необходимо добавить ссылку на WixUIExtension.dll (правой клавишей по названию проекта в Solution Explorer -> Add Reference — открываем папку, в которую был установлен WiX, подкаталог bin)
Ссылку добавили, указываем какой набор мы будем использовать, в конце раздела Product добавим
<Property Value="INSTALLLOCATION" ></Property>
<WixVariable Overridable="yes" Value="License.
rtf"/>
<UIRef/>* This source code was highlighted with Source Code Highlighter.
WixVariable Id=«WixUILicenseRtf» — указывает на путь к файлу лицензии (речи о нем пока не шло, добавили сразу, чтобы два раза не ходить).
WixUI_InstallDir — готовый набор диалоговых окон. Данный набор включает все необходимые нам диалоги. Помимо него так же существуют наборы WixUI_Advanced, WixUI_Mondo, WixUI_FeatureTree, WixUI_InstallDir, WixUI_Minimal.
Приготовления закончены, можно приступать к редактированию файла установки. Для начала посмотрим, что нам нагенерила студия:
Ключ Product — описывает свойства продукта.
Id — идентификатор продукта, уникальный GUID.
Name — название продукта
Language — язык пакета установки
Version — версия продукта
Manufacturer — производитель
UpgradeCode — уникальный GUID
Чтобы упростить себе жизнь определим некоторые переменные. Для чего — название продукта, например, не раз может встречаться в скрипте, если нам захочется его изменить придется искать его по всему скрипту и менять на новое. Чтобы избежать этого определим переменную, которая будет содержать название продукта и, в случае необходимости, будем менять только ее. Над разделом
<?define ProductName="SetupProject1" ?>
<?define ProductVersion="1.0.0.0" ?>
<?define ProductCode="b7bc7c6f-9a4e-4973-be84-eca8e3427c97"?>
<?define UpgradeCode="06a81104-1e30-463d-87e1-e8a79b4c682a"?>
<?define Manufacturer="MyCompany"?>* This source code was highlighted with Source Code Highlighter.
Теперь заменим значение параметров ключа Product на переменные:
<Product Name="$(var.ProductName)" Language="1049" Version="$(var.ProductVersion)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)"> * This source code was highlighted with Source Code Highlighter.
Определимся теперь с тем куда мы будем устанавливать наш продукт.
Ключ Directory — определяет путь для установки.
Directory Id=«TARGETDIR» корневой элемент для всех папок, которые будут использоваться для установки проекта.
Directory Id=«ProgramFilesFolder» папка Program Files (на что указывает Id=«ProgramFilesFolder»).
Directory Id=«INSTALLLOCATION» папка с именем SetupProject1 в папке Program Files. Заменим сразу Name=«SetupProject1» на Name=»$(var.ProductName)»
Добавим файлы в пакет установки. Для этого сначала добавим устанавливаемые компоненты. Следуя совету «Remove the comments around this Component» уберем комментарии с Component внутри целевой папки и добавим туда, например, калькулятор.
<Component Guid="b11556a2-e066-4393-af5c-9c9210187eb2">
<File DiskId='1' Source='C:\WINDOWS\system32\calc.exe'/>
</Component>* This source code was highlighted with Source Code Highlighter.
Установка компонента невозможна без включения его в одну из Feature (
<Feature Title="$(var.ProductName)" Level="1">
<ComponentRef />
</Feature>* This source code was highlighted with Source Code Highlighter.
Осталось добавить ярлык в меню Пуск.
Сначала укажем, что мы собираемся работать с папкой меню Пуск и хотим там создать папку с именем нашей программы, содержащую ярлык на калькулятор.
В раздел Directory Id=«TARGETDIR», где-нибудь в конце добавляем:
<Directory>
<Directory Name="$(var.
ProductName)">
<Component Guid="4CEBD68F-E933-47f9-B02C-A4FC69FDB551">
<Shortcut
Name="Calc"
Description="$(var.ProductName)"
Target="[INSTALLLOCATION]Calc.exe"
WorkingDirectory="INSTALLLOCATION"/>
<RemoveFolder On="uninstall"/>
<RegistryValue Root="HKCU" Key="Software\$(var.Manufacturer)\$(var.ProductName)" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
</Component>
</Directory>
</Directory>* This source code was highlighted with Source Code Highlighter.
Начинаем разбираться:
Directory Id=«ProgramMenuFolder» — указывает на директорию, в которой содержатся ярлыки меню Пуск.
Directory Id=«ApplicationProgramsFolder» — папка нашей программы в меню Пуск
Component — компонент, содержащий ярлык (не забыть включить его в Feature)
Shortcut — собственно ярлык к калькулятору
Финальная версия файла должна выглядеть так:
<?xml version="1.
0" encoding="UTF-8"?><Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?define ProductName="SetupProject1" ?>
<?define ProductVersion="1.0.0.0" ?>
<?define ProductCode="b7bc7c6f-9a4e-4973-be84-eca8e3427c97"?>
<?define UpgradeCode="06a81104-1e30-463d-87e1-e8a79b4c682a"?>
<?define Manufacturer="MyCompany"?>
<Product Name="$(var.ProductName)" Language="1049" Version="$(var.ProductVersion)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)">
<Package InstallerVersion="200" Compressed="yes" />
<Media Cabinet="media1.cab" EmbedCab="yes" />
<Directory Name="SourceDir">
<Directory>
<Directory Name="$(var.ProductName)">
<Component Guid="b11556a2-e066-4393-af5c-9c9210187eb2">
<File DiskId='1' Source='C:\WINDOWS\system32\calc.
exe'/>
</Component>
</Directory>
</Directory>
<Directory>
<Directory Name="$(var.ProductName)">
<Component Guid="4CEBD68F-E933-47f9-B02C-A4FC69FDB551">
<Shortcut
Name="Calc"
Description="$(var.ProductName)"
Target="[INSTALLLOCATION]Calc.exe"
WorkingDirectory="INSTALLLOCATION"/>
<RemoveFolder On="uninstall"/>
<RegistryValue Root="HKCU" Key="Software\$(var.Manufacturer)\$(var.ProductName)" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
</Component>
</Directory>
</Directory>
</Directory>
<Feature Title="SetupProject1" Level="1">
<ComponentRef />
<ComponentRef />
</Feature>
<Property Value="INSTALLLOCATION" ></Property>
<WixVariable Overridable="yes" Value="License.
rtf"/>
<UIRef/>
</Product>
</Wix>
* This source code was highlighted with Source Code Highlighter.
Делаем Build, запускаем, проверяем результат.
Где еще почитать
Страница проекта
Alex Shevchuk: From MSI to WiX (в основном на английском, но есть немного на русском)
WiX Tutorial
wixwiki
Продолжение Часть 2 — фрагменты и инклуды
Создание инсталлятора с помощью WiX. Часть 1. Простой инсталлятор
При написании коммерческого софта часто встает вопрос о способе
его поставки конечному пользователю. Тут можно рассмотреть несколько вариантов:
мы можем поставлять программное обеспечение в виде набора файлов, копируя его
на рабочие места пользователей и затем, настраивая вручную, можем разворачивать
программное обеспечение с помощью облачных сервисов, например Windows Azure. Также мы можем
предоставлять пользователю пакет программ в виде инсталлятора, который включает
в себя этап настройки приложений.
Как показывает опыт, в данный момент мало заказчиков решаются использовать в своем рабочем процессе облачные сервисы. С этим связан ряд причин, начиная от обеспечения безопасности хранимой информации и заканчивая стоимостью готовых решений. Что касается поставки в виде набора файлов, то этот вариант также не является удобным. Представим, что мы разворачиваем сервер приложений. В данном случае при ручной поставке нам необходимо совершить множество рутинных ручных действий: скопировать файлы, настроить конфигурации, зарегистрировать и запустить службу Windows, настроить правила брандмауэра и т.д. При всем этом ручная настройка является чем-то сродни искусству, которое требует большого внимания и концентрации.
Исходя из всего выше сказанного, мне кажется, что самым
удобным способом поставки готового приложения будет подготовка инсталлятора.
Да, для этого понадобится приложить некоторые усилия и потратить время, но это
решение позволит сэкономить время и нервы службы внедрения на этапе
развертывания.
Сейчас на рынке присутствует множество коммерческих решений для создания инсталляторов. Например, InstallShield, InstallAware, InnoSetup, NSIS и прочие. Мы на своем проекте решили остановиться на пакете Microsoft WiX по причине его бесплатности. Технология WiX (Windows Installer XML) – это набор инструментов для упрощения процесса создания дистрибутива на базе MSI.
С этой статьи я хочу начать цикл постов о написании инсталлятора с помощью WiX, начиная с простого инсталлятора, потом рассмотреть встраивание собственных форм, написание расширений и закончить встраиванием процесса подготовки инсталлятора в конвейер поставки на базе TFS.
Итак, мы будем писать инсталлятор для простого сервиса WCF, который будет хоститься как служба Windows. Исходники этого приложения входят в примеры к статье и располагаются в проекте InstallingApplication.
В данной статье мы подготовим простейший инсталлятор, который будет содержать следующий набор окон:
- Приветствие
- Лицензионное соглашение
- Выбор папки установки
- Начало установки.
Сначала скачиваем и устанавливаем WiX. После установки в
Visual Studio будут добавлены новые шаблоны проектов Windows Installer XML. Выбираем шаблон Setup Project. В моем примере проект будет называться ApplicationInstaller.
Изначально будет создан один файл Product.wxs. Это основной файл, в котором описывается поведение инсталлятора.
Настроим поддержку русского языка. Для этого в секции Product изменим значение атрибута Language на 1049. Это магическое число укажет, что инсталлятор должен использовать русскую локаль. Затем откроем свойства проекта и во вкладке Build укажем значение «ru-RU» для параметра Culture to build (без кавычек). На данном этапе этого будет достаточно, чтобы наш инсталлятор научился говорить по-русски.
После этого подчистим файл Product.wxs. Удалим все секции Fragment и MajorUpdate. Пока они нам не нужны.
Добавим описание директорий, куда будем инсталлировать наше
приложение.
<Directory Name="SourceDir"> <Directory> <Directory Name="ApplicationServer" /> </Directory> <Directory> <Directory Name="ApplicationServer" /> </Directory> </Directory>
Тэг Directory определяет путь для установки. Directory Id=”TARGETDIR” – корневой элемент для всех папок, в которые будет инсталлироваться наше приложение. Directory Id=”ProgramFilesFolder» указывает на папку Program Files. Directory Id=”INSTALLLOCATION” – это папка с именем ApplicationServer в папке Program Files. Эта иерархия описывает расположение нашей программы по умолчанию.
Второе описание иерархии папок указывает расположение ярлыков к нашему приложению. Id=”ProgramMenuFolder” ссылается на папку меню Пуск. В меню пуск будет создана папка ApplicationServer.
Добавим файлы к папке установки. Для этого создадим файл Files. wxs и запишем в
него следующее содержимое.
<DirectoryRef FileSource="..\..\InstallingApplication\ApplicationWindowsService\bin\Debug\"> <Component Id ="ProductComponents" DiskId="1" Guid="{B65CDCEE-7130-4759-A8E8-16D84717CCF2}"> <File Name="ApplicationService.Common.dll"/> <File Name="ApplicationWindowsService.exe"/> <File Name="ApplicationWindowsService.exe.config"/> <File Name="log4net.dll"/> </Component> </DirectoryRef>
Секция DirectoryRef ссылается на описанную ранее папку c идентификатором INSTALLLOCATION. Атрибут FileSource содержит путь, по которому необходимо искать все файлы, добавляемые в инсталлятор. В данном случае указан относительный путь до скомпилированных модулей нашей службы.
Секция Component включает
описание устанавливаемых файлов. Для задания значения атрибуту Guid рекомендую
использовать тулзу Create Guid из Visual Studio
(Меню Tools – Create GUID). Далее секция File описывает конкретный устанавливаемый файл. Секция для
корректной работы должна содержать уникальный идентификатор Id (в моем случае он совпадает с именем
файла). Атрибут Name указывает, что файл нужно искать по заданному имени в
директории FileSource.
Теперь давайте опишем ярлыки, которые мы будем создавать. В меню Пуск мы создадим два ярлыка: для запуска приложения и для деинсталляции. На практике для серверных приложений не стоит указывать ярлык для запуска, и здесь я это привожу только для примера. Создадим файл Shortcuts.wxs и добавим в него следующее.
<DirectoryRef> <Component Guid="{DFA97C7E-E565-44D2-8D1E-7AB1E52ADB01}"> <Shortcut Name="Application Server" Description="Start application server" Target="[INSTALLLOCATION]ApplicationWindowsService.exe" WorkingDirectory="INSTALLLOCATION"/> <Shortcut Name="Uninstall application serrver" Description="Uninstall application serrver" Target="[System64Folder]msiexec.exe" Arguments="/x [ProductCode]"/> <RemoveFolder On="uninstall"/> <RegistryValue Root="HKCU" Key="Software\MyCompany\ApplicationServer" Name="installed" Type="integer" Value="1" KeyPath="yes"/> </Component> </DirectoryRef>
Секция Shortcut указывает на создание ярлыка. Первая секция создает ярлык для нашего приложения с указанием в качестве рабочей директории папки установки. Вторая секция Shortcut немного интересней. Она создает ярлык для деинсталляции нашего приложения. Для этого используется программа msiexec с ключом /x.
Секция RemoveFolder говорит о том, что при деинсталляции необходимо удалить папку
с ярлыками из меню пуск. Оставшаяся секция RegistyValue необходима для того, чтобы
удаление заработало. Я сильно не вдавался в подробности, но без создания этого
ключа деинсталляция работать не будет.
На этом почти все. Осталось описать все наши компоненты в секции Feature файла Product.wxs. Этот элемент может быть использован, когда нам необходимо дать пользователю возможность выбора, что устанавливать, а что нет. В условиях нашей задачи ничего не говорилось о возможности выбора, но, несмотря на это нам необходимо привязать описанные секции Component к одной единственной Feature.
<Feature Title="ApplicationInstaller" Level="1"> <ComponentRef /> <ComponentRef/> </Feature>
Напоследок допишем еще две строки для подключения графического интерфейса к нашему инсталлятору. К проекту инсталлятора необходимо добавить ссылку на сборку WixUIExtension из поставки WiX. Эта библиотека расширений позволит подключить интерфейс пользователя.
<Property Value="INSTALLLOCATION"></Property> <UIRef/>
Все!
Теперь после компиляции мы получим файл ApplicationInstaller. msi, который и
является нашим готовым инсталлятором.
На этом все. Все исходники можно взять здесь.
Дополнительные источники:
- Книга по WiX
- Еще одна книга по WiX от нашего соотечественника.
How To: Add File to Your Installer
Установка файлов является наиболее фундаментальным аспектом любой программы установки, и обычно это то, что в первую очередь побуждает людей создавать программу установки. Изучение того, как поместить файл на диск с использованием передовых методов установщика Windows, не только обеспечивает удобство сопровождения в будущем, но и позволяет создавать исправления позже, если это необходимо.
Шаг 1. Определите структуру каталогов
У установщиков часто есть много файлов, которые нужно установить в несколько мест на диске. Чтобы улучшить читаемость файла WiX, рекомендуется сначала определить каталоги установки, прежде чем перечислять файлы, которые вы будете устанавливать. Каталоги определяются с помощью элемента Directory и описывают иерархию папок, которые вы хотели бы видеть на целевой машине. В следующем примере определяется каталог для установки основного исполняемого файла приложения.
Элемент с идентификатором TARGETDIR требуется Windows Installer и является корнем всех структур каталогов для вашей установки. Каждый проект WiX будет иметь этот элемент каталога. Второй элемент с идентификатором ProgramFilesFolder использует предопределенное свойство установщика Windows для ссылки на папку Program Files на компьютере пользователя. В большинстве случаев это разрешается до c:\Program Files\ . Третий элемент каталога создает папку вашего приложения в Program Files, и ему присваивается идентификатор APPLICATIONROOTDIRECTORY для последующего использования в проекте WiX. Идентификатор написан заглавными буквами, чтобы сделать его общедоступным свойством, которое можно установить из пользовательского интерфейса или через командную строку.
Результатом этих тегов является папка c:\Program Files\My Application Name на целевой машине.
Шаг 2. Добавьте файлы в пакет установщика
Файл добавляется в установщик с помощью двух элементов: элемент Component для указания атомарной единицы установки и элемент File для указания файла, который необходимо установить.
Элемент component описывает набор ресурсов (обычно это файлы, записи реестра и ярлыки), которые необходимо установить как единое целое. Это не зависит от того, состоит ли набор элементов из логической функции, которую пользователь может выбрать для установки, что обсуждается на шаге 3. Хотя это может показаться не таким уж важным, когда вы впервые создаете свой установщик, компоненты играют решающую роль, когда вы решаете создать патчи позже.
В общем, вы должны ограничиться одним файлом для каждого компонента. Установщик Windows предназначен для поддержки тысяч компонентов в одном установщике, поэтому, если у вас нет веской причины, используйте один файл для каждого компонента. Каждый компонент должен иметь свой уникальный идентификатор GUID . Несоблюдение этих двух основных правил может привести ко многим проблемам в будущем, когда дело доходит до обслуживания.
В следующем примере структура каталогов, определенная на шаге 1, используется для установки двух файлов: исполняемого файла приложения и файла документации.
Элемент DirectoryRef используется для ссылки на структура каталогов, созданная на шаге 1. При ссылке на каталог APPLICATIONROOTDIRECTORY файлы будут установлены в c:\program files\Моя папка Имя приложения . Под DirectoryRef находятся два элемента Component, по одному для каждого из двух файлов, которые будут установлены. Это соответствует наилучшей практике использования одного компонента в файле. Каждому элементу компонента присваивается идентификатор и идентификатор. Идентификатор используется для ссылки на компонент позже в проекте WiX. Guid используется позже для исправлений и должен быть уникальным для каждого компонента. Сведения о создании идентификаторов GUID см. в разделе Как создать идентификатор GUID.
Под каждым компонентом находится элемент File, который выполняет фактическую работу по упаковке исходных файлов в программу установки. Идентификатор используется для ссылки на файл в другом месте проекта WiX. Атрибут Source указывает расположение файла на вашем компьютере, поэтому WiX может найти его и встроить в установщик.
Для атрибута KeyPath задано значение yes, чтобы указать установщику Windows, что этот конкретный файл следует использовать для определения того, установлен ли компонент. Если вы не установите атрибут KeyPath, WiX будет просматривать дочерние элементы под компонентом в последовательном порядке и пытаться автоматически выбрать один из них в качестве ключевого пути. Разрешение WiX автоматически выбирать ключевой путь может быть опасным, поскольку добавление или удаление дочерних элементов в компоненте может непреднамеренно привести к изменению ключевого пути, что может привести к проблемам при установке. Как правило, всегда следует устанавливать для атрибута KeyPath значение yes, чтобы гарантировать, что путь к ключу не изменится непреднамеренно, если вы в будущем обновите свою авторскую установку.
Для атрибута Checksum должно быть задано значение yes для исполняемых файлов, имеющих значение контрольной суммы в заголовке файла (обычно это верно для всех исполняемых файлов), и используется установщиком Windows для проверки правильности файла при повторной установке. .
Шаг 3. Попросите установщика Windows установить файлы
После определения структуры каталогов и списка файлов, которые необходимо упаковать в установщик, последним шагом будет указание установщику Windows фактически установить файлы. Для этого используется элемент Feature, где вы разбиваете свой установщик на логические части, которые пользователь может установить независимо. В следующем примере создается одна функция, которая устанавливает исполняемый файл приложения и документацию из шага 2.
Компоненту присвоен идентификатор. Если вы используете последовательность пользовательского интерфейса установщика, которая включает выбор функции, атрибут Title содержит текст, отображаемый в пользовательском интерфейсе для функции. Атрибут Уровень должен быть установлен на 1, чтобы включить установку функции по умолчанию.
Элемент ComponentRef используется для ссылки на компоненты, созданные на шаге 2, с помощью атрибута Id.
Полный образец
Ниже приведен полный образец, в котором используются описанные выше концепции. Этот пример можно вставить в проект WiX и скомпилировать или скомпилировать и связать из командной строки для создания установщика.
microsoft.com/wix/2006/wi">
Набор инструментов WiX / Примеры
#
| Резюме▾
| Веха▾
| Статус▾
| Владелец▾
| Создано▾
| Обновлено▾
| |
---|---|---|---|---|---|---|---|
33 | Требуется установщик Javafx из примера wixtoolset | Нет | открыть | 2014-08-18 | 2014-08-18 | ||
31 | фреймворк версии 4.![]() | Нет | открыть | WiX-сборка | 2013-05-12 | 2013-05-12 | |
30 | Ожидаемые значения 90 190 для ManagedRuntimeVersion и ManagedPipelineModeНет | открыть | WiX-сборка | 2013-05-12 | 2013-05-12 | ||
29 | Попытка использовать WiX для установки документации в новую структуру каталогов | Нет | открыть | 2013-02-07 | 2015-01-17 | ||
28 | Изменить значение в XML с помощью параметров командной строки с помощью установщика WIX | Нет | открыть | 2013-01-17 | 2013-01-17 | ||
27 | Управляемый загрузчик — как передавать переменные для управления полной установкой | Нет | открыть | 2013-01-01 | 2013-01-01 | ||
26 | Локализация установки и пропуск экрана лицензионного соглашения | Нет | открыть | 2011-09-12 | 2015-02-26 | ||
23 | Полный путь обновления, распространяемый с помощью Wix | Нет | открыть | 2010-11-19 | 2012-09-15 | ||
22 | wix многоязычный | Нет | открыть | 2010-10-19 | 2015-02-15 | ||
21 | Как: в модуле использовать ComponentGroup из фрагмента | Нет | открыть | 2009-11-13 | 2012-09-15 | ||
20 | How To: Heat — Установить файл/@Source с препроцессором Var | Нет | открыть | 2009-04-24 | 2012-09-15 | ||
19 | Как: Нагрев — подавление корневого каталога | Нет | открыть | 2009-04-24 | 2014-08-25 | ||
18 | Как: Нагрев — Укажите DirectoryRef/@Id | Нет | открыть | 2009-04-24 | 2012-09-15 | ||
17 | Как: Нагрев — Укажите группу компонентов | Нет | открыть | 2009-04-24 | 2012-09-15 | ||
16 | Как: Подавить предупреждения ICE | Нет | открыть | 21 июля 2008 г.![]() | 2012-09-15 | ||
15 | Как: Подготовьте программу установки к поддержке основных обновлений | Нет | открыть | 21 июля 2008 г. | 2012-09-15 | ||
14 | Как настроить существующие диалоговые окна пользовательского интерфейса WiX | Нет | открыть | 21 июля 2008 г. | 2012-09-15 | ||
13 | Как добавить диалоговое окно в последовательность пользовательского интерфейса WiX | Нет | открыть | 21 июля 2008 г. | 2012-09-15 | ||
11 | Как: Автоматически установить версию MSI из исполняемого файла | Нет | открыть | 21 июля 2008 г. | 2012-09-15 | ||
8 | Автоматизировать версию в Project | Нет | открыть | 2007-10-11 | 2013-06-03 | ||
7 | Рабочее использование CrystalReports11_5_NET_2005.![]() | Нет | открыть | 2007-04-30 | 2012-09-15 | ||
6 | Пример запуска службы при необходимости установки | Нет | открыть | 2007-03-19 | 2012-09-15 | ||
5 | Учебникнеправильно предполагает инструменты в PATH | Нет | открыть | 27 февраля 2007 г. | 2012-09-15 | ||
4 | пример загрузчика | Нет | открыть | 2005-12-12 | 2012-09-15 | ||
3 | Создание структуры каталогов на другом диске | Нет | открыть | 2005-08-12 | 2012-09-15 |
- Номер билета
- Резюме
- Веха
- Положение дел
- Владелец
- Создатель
- Созданный
- Обновлено
- Этикетки
(относится только к этой странице)
1 2 > >> (Страница 1 из 2)
О нет! Не удалось загрузить некоторые стили.