Сначала бесстыдная реклама пользовательских действий C ++! : -).
Шаг -По шагу : я попробую, пожалуйста попробуйте это (вы можете перейти к нижнему источнику, если вы как-то сделали с этими предварительными шагами - это пошагово для реального и очень медленного перехода к действию - вы можете получить то, что вам нужно, прямо из источника WiX):
- В решении WiX Visual Studio,
right click solution node at top
=> Add
=> New Project...
- Разверните узел WiX Toolset, выберите v3 (при условии, что вы используете версию WiX)
- Дважды щелкните
"C# Custom Action Project for WiX v3"
- Щелкните правой кнопкой мыши
"References"
в проекте WiX (не в проекте C#) => Add Reference...
- Go
"Projects"
и добавьте ссылку на C# project
(двойной щелчок и ОК) - Выполните тестовую сборку. При условии, что не было ошибок, прежде чем их не должно быть сейчас.
Вы должны увидеть что-то вроде "CustomAction1.CA.dll"
в окне вывода сборки. Суффикс *.CA.dll
добавляется в DLL-оболочку win32 для исходного управляемого кода DLL. Все это обрабатывается самим WiX - или фактически интеграцией Votive Visual Studio для WiX - просто знайте разницу:
"CustomAction1.dll"
- управляемый код DLL. "CustomAction1.CA.dll"
- нативная библиотека оболочки win32, содержащая нативный и несколько других компонентов. Include this version in your MSI
.
Добавьте следующий фрагмент:
<Binary Id="CustomActions" SourceFile="$(var.CustomAction1.TargetDir)\$(var.CustomAction1.TargetName).CA.dll" />
Выше следует скомпилировать фактический C# DLL в MSI. Вы можете открыть MSI в Orca и увидеть в двоичной таблице.
- Это не очень хорошо, но я хотел бы добавить ссылку на
System.Windows.Forms
и использовать MessageBox.Show
, чтобы показать диалоговое окно из настраиваемого действия, чтобы убедиться, что оно работает должным образом. Я также добавляю команду запуска отладчика приложения для dll, встроенных в режим отладки. Таким образом, Visual Studio будет автоматически вызываться (если все работает правильно), чтобы можно было пошагово выполнить код. - Добавьте ссылку на
"System.Windows.Forms"
, щелкнув правой кнопкой мыши ссылку C# проекта. узел, а затем добавьте "System.Windows.Forms"
. Также добавьте "using System.Windows.Forms;"
в начало исходного файла - см. Полный исходный код ниже. Необходимо помнить ссылку "System.Windows.Forms"
на уровне проекта. Теперь добавьте это в качестве тестового кода в проект настраиваемого действия "CustomAction1"
Фрагмент кода пользовательского действия (см. раздел кода в нижней части для полного источника):
// will launch the debugger for debug-build dlls
#if DEBUG
System.Diagnostics.Debugger.Launch();
#endif
MessageBox.Show("hello world");
Чтобы получить стандартную настройку GUI (для тех, кто читает это), добавьте ссылку на WiXUIExtension
как объяснено здесь (это шаг за шагом для создания базового c WiX-проекта, который компилируется и имеет GUI), а затем вставляет это в ваш источник:
<UIRef Id="WixUI_Mondo" />
Мне нравится менять <MediaTemplate />
на <MediaTemplate EmbedCab="yes" />
, чтобы избежать внешних файлов cab с исходным кодом (с этим изменением cabs скомпилированы в MSI).
Если у вас нет добавленных компонентов, вы можете добавить это, чтобы включить notepad.exe
в MSI для тестовой установки в каталоге INSTALLFOLDER
(просто хитрость для установки чего-либо без наличия исходных файлов - исходный путь, который должен быть разрешен на любой машине) - rep зашнуруйте весь раздел "TODO" - см. полный источник ниже:
<Component Feature="ProductFeature">
<File Source="C:\Windows\Notepad.exe" />
</Component>
Теперь нам нужно объявить собственное пользовательское действие и вставить его в последовательность установки. Давайте добавим это к предыдущему <Binary> element
:
<CustomAction Id="CA1" BinaryKey="CustomActions" DllEntry="CustomAction1"/>
<InstallUISequence>
<Custom Action="CA1" After="CostFinalize" />
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="CA1" After="CostFinalize" />
</InstallExecuteSequence>
Теперь соберите и протестируйте MSI. Вы должны получить множество "hello world"
сообщений.
- Это общее
"heartbeat"
настраиваемого действия C# / управляемого кода - способ Я иногда использую их.
Фактический источник WiX : И теперь, синтез - не забудьте заменить все GUID! :
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="DemoCA" Language="1033" Version="1.0.0.0" Manufacturer="test" UpgradeCode="0adf972a-5562-4a6f-a552-dd1c16761c55">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate EmbedCab="yes" />
<UIRef Id="WixUI_Mondo" />
<!-- START CUSTOM ACTION CONSTRUCTS -->
<Binary Id="CustomActions" SourceFile="$(var.CustomAction1.TargetDir)\$(var.CustomAction1.TargetName).CA.dll" />
<CustomAction Id="CA1" BinaryKey="CustomActions" DllEntry="CustomAction1"/>
<InstallUISequence>
<Custom Action="CA1" After="CostFinalize" />
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="CA1" After="CostFinalize" />
</InstallExecuteSequence>
<!-- END CUSTOM ACTION CONSTRUCTS -->
<Feature Id="ProductFeature" Title="AddingCSharpCustomActions" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="AddingCSharpCustomActions"/>
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component Feature="ProductFeature">
<File Source="C:\Windows\Notepad.exe" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>
Краткое описание : краткая сводка необходимых изменений:
- Установить в поле производителя что-то.
- Добавить и измените конструкции пользовательских действий, как указано выше.
- Добавьте элементы Component / File по направлению вниз, заменив там раздел «TODO».
- Установите
MediaTemplate
для использования встроенные кабины, как описано выше (необязательно, не обязательно для работы образца).
Код настраиваемого действия : И, наконец, фактический C# тестовый код настраиваемого действия - обновлен Debugger.Launch, который запустит отладчик для библиотеки отладочной сборки. Затем вы можете присоединить отладчик к правильному исходному проекту и выполнить пошаговый код:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Deployment.WindowsInstaller;
using System.Windows.Forms;
namespace CustomAction1
{
public class CustomActions
{
[CustomAction]
public static ActionResult CustomAction1(Session session)
{
#if DEBUG
System.Diagnostics.Debugger.Launch();
#endif
MessageBox.Show("hello world");
session.Log("Begin CustomAction1");
return ActionResult.Success;
}
}
}
Ссылки :