Как объединить несколько сборок в одну?


87

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

dll

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

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

JsonServiceClient client = new JsonServiceClient(servicepath);

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

Ответы:


120

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

ИЛИ

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

ИЛИ

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

4
Спасибо, что напомнили мне решение Джеффри Рихтера о встраивании сборок! См. Мой ответ, в котором упоминается Costura как инструмент, сочетающий это с введением необходимого кода.
CodeFox

29

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

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

Существует также статья , в которой описывается , как включить ILMerge в настройку вашего проекта VS здесь


Привет, могу ли я добавить внешний ресурс (файл / изображение) в исполняемый файл?
Эмдадул Савон,

@EmdadulSawon, может быть, вы можете включить их в качестве ресурсов в одну из своих библиотек?
Александр

27

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

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

В результате получилось очень простое решение, для которого достаточно получить Costura.Fody из NuGet.

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

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

9
OMG Costura.Fody - правильный ответ. Установил пакет из nuget, пересобирал проект, и теперь у меня есть автономный EXE УДИВИТЕЛЬНЫЙ !!
Эрик Лабашоски

4
Не могу поверить, насколько это просто. Просто установите пакеты из nuget, и все готово.
iraSenthil

2
Я тоже использую Costura.Fody. Его легко настроить и очень легко включить пакеты NuGet в качестве ресурсов. Получить проект.
Майкл Сильвер

1
@ user3700562, этот метод не создает новые сборки, а скорее встраивает одну или несколько ссылочных сборок в существующую.
CodeFox

1
Отличное решение! Пользуюсь им уже год и проблем не было. Но обратите внимание, что он включает только сборки, на которые ссылается ваш лучший проект. Если ваше приложение ссылается на другой проект, который ссылается на стороннюю сборку, вам необходимо добавить его в свой проект верхнего уровня.
Demir

7

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


2
Фантастика! Отлично сработало для меня!
Alex Pelletier

1
Codeplex закрывается, поэтому вот ссылка на перемещенный проект: bitbucket.org/wvd-vegt/ilmergegui
Hegi

3

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

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

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

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

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


2

Извлекает ServiceStack.Gap проект , который показывает несколько примеров МЕТОДИЧЕСКИЕ ILMerge ServiceStack в один кросс-платформенной EXE - файл .

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

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

1

.net core 3 представляет две новые опции в конфигурации проекта, которые называются публикацией и обрезкой одного файла.

Вы можете найти более подробную информацию о документации здесь , конфигурация проекта скопирована здесь для справки.

  1. Конфигурация проекта:
    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
      <PublishSingleFile>true</PublishSingleFile>
    </PropertyGroup>

    <PropertyGroup>
      <PublishTrimmed>true</PublishTrimmed>
    </PropertyGroup>
  1. Используя CLI:
    dotnet publish -r win10-x64 -p:PublishSingleFile=true
    dotnet publish -r <rid> -c Release

Полностью поддерживается объединение двух вариантов вместе для получения единой обрезанной сборки для вашего приложения.


Это не дает вам единой сборки. Он просто сжимает ваши файлы в zip-архив, а затем распаковывает его в пользовательскую папку, когда вы пытаетесь запустить приложение.
Джеспер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.