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

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

DLLs

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

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

JsonServiceClient client = new JsonServiceClient(servicepath);

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

6 ответов

Решение

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

ИЛИ ЖЕ

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

ИЛИ ЖЕ

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

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

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

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

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

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

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

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

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

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

.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

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

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

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

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

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

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

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

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

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