Подтвердить что ты не робот

Как выполнить файл 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 файлом?

4b9b3361

Ответ 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 вы можете найти примеры в Интернете.

Это лучший способ, который я нашел.