Как выполнить DLL-файл настраиваемого действия WiX с зависимостями

Я хочу создать файл CustomAction C # DLL, который зависит от сторонней .NET DLL ( в данном конкретном случае это MySql.Data.dll). У меня есть файл DLL настраиваемого действия C #, работающий с фрагментом 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?


person Adam Tegen    schedule 19.10.2009    source источник


Ответы (4)


DTF в наборе инструментов WiX имеет механизм для включения вашей сборки настраиваемого действия и всех ее ссылок в один двоичный файл (в основном самораспаковывающуюся dll). Я не пишу управляемые настраиваемые действия (C / C ++ создает настраиваемые действия с меньшим количеством зависимостей и увеличивает вероятность успеха), но предполагается, что он просто работает при сборке в VS.

person Rob Mensching    schedule 20.10.2009
comment
Это действительно сработало, возможно, из-за того, что процесс сборки настраиваемого действия обрабатывает добавление этих зависимостей. Если я правильно понимаю, они становятся частью .CA.dll, который создается сборкой Custom Action. blogs.msdn.com/jasongin/ архив / 2008/05/23 / - person Adam Tegen; 20.10.2009
comment
@AdamTegen Спасибо за публикацию этой статьи, спасла меня еще на неделю, когда я бился головой об стену! Важной строкой было: Процесс сборки настраиваемого действия автоматически упакует любые сборки, не относящиеся к GAC, от которых зависит ваш CA. У меня были все мои зависимые сборки в GAC в моем окне разработки, и я не мог понять, почему они не кажутся присутствовать на тестовой коробке. Спасибо! - person David Work; 26.07.2013
comment
В качестве примечания для других убедитесь, что ваш элемент Binary указывает на .CA.dll файл, который генерирует WiX, а не на исходную .NET DLL. - person Cocowalla; 11.12.2013
comment
@rob Я разрабатываю настраиваемое действие с помощью C #. какие-либо ресурсы о том, как это сделать? - person Arjun Vachhani; 20.01.2020

Установите для свойства «Копировать локально» для жесткой ссылки значение True в Visual Studio.

person David    schedule 05.03.2010
comment
Для меня это было так просто. Спасибо! - person Ed Bayiates; 15.05.2019

Вы можете использовать <Binary /> для добавления любых файлов, необходимых для выполнения настраиваемых действий. Это должно относиться и к любым сторонним dll, которые вам требуются. Файлы, включенные с использованием двоичного элемента, используются только во время установки и не будут рассматриваться как часть устанавливаемого приложения.

Обновление: соединение между CustomAction и Binary осуществляется путем ссылки на двоичный файл из настраиваемого действия с помощью атрибута BinaryKey.

Если у вас не может быть несколько атрибутов BinaryKey (я не пробовал это и не вижу напрямую поддержки для этого в Таблица настраиваемых действий MSI) вы можете иметь настраиваемое действие только в зависимости от одного двоичного файла. Таким образом, этот двоичный файл должен будет нести в себе все необходимые зависимости.

Тем не менее, если все ваши библиотеки DLL являются сборками .Net, идея заключалась бы в использовании ILMerge, чтобы упаковать их в одну сборку.

person Peter Lillevold    schedule 20.10.2009
comment
Это не сработает. Ни один из дополнительных двоичных потоков не извлекается. - person Rob Mensching; 20.10.2009

Следуя за комментарием г-на Меншинга, я внесу немного более подробностей.

Предполагая, что вы используете как минимум 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 

Как только это сработает, конвертируйте в событие после сборки:

"$(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 можно найти в Интернете.

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

person William Shurtleff    schedule 18.06.2015