Как выполнить файл DLL с настраиваемым действием WiX с зависимостями
Я хочу создать DLL файл CustomAction С#, который зависит от сторонней .NET DLL (в этом конкретном случае он MySql.Data.dll
). У меня есть DLL файл с пользовательским действием С#, работающий с фрагментом WiX ниже. Я просто пытаюсь понять, как безопасно добавлять зависимость к пользовательскому действию. Примечание. Мне действительно не нужен этот файл сторонних DLL файлов для запуска установленного приложения.
<Binary Id="MyCustomAction.dll" SourceFile="MyCustomAction.CA.dll" />
<CustomAction Id="FixupConfigForMysql" Return="check" />
<InstallExecuteSequence>
<Custom Action='FixupConfigForMysql' After='InstallFiles'>NOT Installed</Custom>
</InstallExecuteSequence>
Нужно ли мне установить сторонний DLL файл (MySql.Data.dll
), чтобы запустить пользовательское действие?
Можно ли добавить еще один бинарный тег с сторонним DLL файлом?
Ответы
Ответ 1
DTF в наборе инструментов WiX имеет механизм включения вашей настраиваемой сборки действий и всех ее ссылок в одну двоичную (самораспаковывающуюся dll, в основном). Я не пишу управляемые пользовательские действия (C/С++ создает настраиваемые действия с меньшим количеством зависимостей и увеличивает вероятность успеха), но он должен работать только при построении в VS.
Ответ 2
Вы можете использовать <Binary />
для добавления любых файлов, необходимых для запуска пользовательских действий. Это должно пойти на любые сторонние DLL файлы, которые вам требуются. Файлы, используемые с использованием двоичного элемента, используются только во время установки и не будут рассматриваться как часть устанавливаемого приложения.
Обновление: соединение между CustomAction и Binary выполняется путем ссылки на двоичный файл из пользовательского действия с использованием атрибута BinaryKey.
Если вы не можете иметь несколько атрибутов BinaryKey (я не пробовал этого и не вижу прямой поддержки для этого в Таблица пользовательских действий MSI) у вас может быть только пользовательское действие в зависимости от одного двоичного файла. Таким образом, этот двоичный код должен будет нести все необходимые зависимости внутри себя.
Тем не менее, если ваши DLL - это все .Net-сборки, идея заключалась бы в использовании ILMerge, чтобы упаковать их в одну единую сборку.
Ответ 3
Установите свойство "Скопировать локальное" на жесткую ссылку на True в Visual Studio.
Ответ 4
Следуя комментарию г-на Меншинга, я напишу немного подробнее.
Предполагая, что вы по крайней мере на Wix 3.0, вы можете использовать MakeSfxCA.exe для зависимости от пакетов в одной DLL. (Это была надстройка от DFT - Deployment Tools Foundation.) В принципе, начните с того, что проект копирует ваши зависимые DLL. Создайте файл CustomAction.config. Протестируйте с помощью простого .bat файла, например:
REM MyMakeSfxCA.bat - Run under $(TargetDir); abs. paths reqd.
"%WIX%\SDK\MakeSfxCA" ^
%cd%\Managed_custom_action_pkg.dll ^
"%WIX%\SDK\x86\sfxca.dll" ^
%cd%\Managed_custom_action.dll ^
%cd%\Dependent1.dll ^
%cd%\Dependent2.dll ^
%cd%\Microsoft.Web.Administration.dll ^
%cd%\Microsoft.Deployment.WindowsInstaller.dll ^
%cd%\CustomAction.config
Как только это произойдет, преобразуйтесь в событие Post-Build:
"$(WIX)\SDK\MakeSfxCA" ^
$(TargetDir)\Managed_custom_action_pkg.dll ^
"$(WIX)\SDK\x86\sfxca.dll" ^
$(TargetDir)\Managed_custom_action.dll ^
$(TargetDir)\Dependent1.dll ^
$(TargetDir)\Dependent2.dll ^
$(TargetDir)\Microsoft.Web.Administration.dll ^
$(TargetDir)\Microsoft.Deployment.WindowsInstaller.dll ^
$(TargetDir)\CustomAction.config
В вашем .wxs файле ваш двоичный ключ будет выглядеть так:
<Binary Id="Managed_custom_action_CA_dll"
SourceFile="$(var.Managed_custom_action.TargetDir)$(var.Managed_custom_action.TargetName)_pkg.dll" />
Для них CustomAction.config вы можете найти примеры в Интернете.
Это лучший способ, который я нашел.