Как объединить несколько сборок в одну? - PullRequest
79 голосов
/ 10 ноября 2011

Я использую свой стек служб с помощью проекта EXE (задача запуска приложения Azure), поскольку скопировал следующие DLL-файлы стека служб и некоторые библиотеки Azure в проект EXE.

dlls

Когда я собираю этот EXE-проект, то DLL-библиотеки Azure будут связаны с моим EXE-файлом, но DLL-библиотека стека служб не будет связана с EXE-файлом, потому что для запуска моего EXE-файла на любой машине мне нужно скопировать все DLL-библиотеки стека служб вручную.

Я использовал dll этого стека служб для использования

JsonServiceClient client = new JsonServiceClient(servicepath);

Что я должен сделать, чтобы связать все эти DLL-файлы с моим EXE-файлом?

Ответы [ 6 ]

113 голосов
/ 10 ноября 2011

У вас есть несколько вариантов:

OR

  • используйте какой-нибудь инструмент, например SmartAssembly (коммерческий)
    он может встраиваться и объединяться между прочим (не нужно менять исходный код)

OR

  • кодируйте себя менее чем в 10 строках (бесплатно, но с минимальным изменением исходного кода)
    пометить все необходимые зависимости как «встроенный ресурс» - так они будут включены в EXE-файл ... вам нужно установить обработчик AssemblyResolve, который во время выполнения считывает ресурсы и возвращает необходимые DLL в .NET runtime ...
29 голосов
/ 10 ноября 2011

Инструмент, который вы ищете, называется ILMerge .Это инструмент командной строки, и его можно использовать следующим образом:

ilmerge /target:winexe /out:MyApp.exe 
        MyExe.exe ServiceStack.dll ServiceStack.Interfaces.dll ServiceStack.ServiceInterface.dll  ServiceStack.Text.dll

Также есть статья, в которой описано, как включить ILMerge в настройки проекта VS здесь

22 голосов
/ 23 сентября 2015

Отличным инструментом для включения ссылочных сборок в качестве встроенных ресурсов является Costura (надстройка Fody ). Автор Саймон Кропп описывает это следующим образом:

[...] комбинация двух методов:

Результатом является супер простое решение, которое просто требует получить Costura.Fody от NuGet.

Особенности:

  • Включая символы отладки
  • Сжатие встроенных сборок
  • Включая / исключая определенные сборки
  • Другие (см. Readme )
7 голосов
/ 26 июня 2015

Попробуйте ILMerge-GUI, слияние .NET .Это основанный на графическом интерфейсе Ilmerge, который избегает всей работы командной строки.

3 голосов
/ 13 апреля 2016

Если у вас есть зависимости WPF, ваши параметры могут быть более ограниченными ..... ILMerge, похоже, не справляется с ними. Costura.Fody (как упомянуто Codefox выше), однако, отлично сработали для нас и заняли около 5 минут, чтобы начать ... очень хороший опыт.

Установка с Nuget (выбор правильного проекта по умолчанию в консоли диспетчера пакетов).

Он объединяет все библиотеки DLL, помеченные как «Copy Local» = true, и создает объединенный файл .EXE (наряду со стандартным выводом, большинство из которого теперь не нужны), который также сжимается. Это может быть использовано автономно.

Лицензия MIT, так что вы можете изменять / распространять по мере необходимости.

https://github.com/Fody/Costura/

2 голосов
/ 26 июня 2015

Оформление проекта ServiceStack.Gap , в котором показано несколько примеров того, как ILMerge ServiceStack объединен в одну кроссплатформенную .exe .

ServiceStack также включает в себя ряд других функций, которые особенно хорошо подходят для создания встроенных приложений, где он:

  • Позволяет размещать ваши службы самостоятельно, используя HTTP-прослушиватель .NET
  • Поддерживает предварительно скомпилированные Razor Views
  • Поддерживает встроенные ресурсы
  • Поддерживает встроенную базу данных в Sqlite и OrmLite
  • Может быть ILMerged в один .exe
...