Как объединить несколько сборок в одну?
Я использую свой стек служб с помощью проекта EXE (задача запуска приложения Azure), поскольку скопировал следующие DLL-файлы стека служб и некоторые библиотеки Azure в проект EXE.
Когда я собираю этот 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). Автор Саймон Кропп описывает это следующим образом:
[...] комбинация двух методов:
- Предложение Джеффри Рихтера об использовании встроенных ресурсов как метода объединения сборок
- Предложение Эйнара Эгильссона об использовании cecil для создания инициализаторов модулей
Результатом является супер простое решение, которое просто требует получить 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 представляет две новые опции в конфигурации проекта, которые называются публикацией и обрезкой одного файла.
Вы можете найти более подробную информацию о документации здесь, конфигурация проекта скопирована здесь для справки.
- Конфигурация проекта:
<PropertyGroup>
<RuntimeIdentifier>win10-x64</RuntimeIdentifier>
<PublishSingleFile>true</PublishSingleFile>
</PropertyGroup>
<PropertyGroup>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
- Используя 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, так что вы можете изменять / распространять по мере необходимости.
Ознакомьтесь с проектом ServiceStack.Gap, в котором показано несколько примеров того, как ILMerge ServiceStack объединен в один кроссплатформенный .exe.
ServiceStack также включает в себя ряд других функций, которые особенно хорошо подходят для создания встроенных приложений, где:
- Позволяет вашим службам размещаться самостоятельно с помощью HTTP-прослушивателя.NET
- Поддерживает предварительно скомпилированные Razor Views
- Поддерживает встроенные ресурсы
- Поддерживает встроенную базу данных в Sqlite и OrmLite
- Может быть ILMerged в один.exe