Як об’єднати кілька збірок в одну?


87

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

dll

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

Я використовував dll цього сервісного стека

JsonServiceClient client = new JsonServiceClient(servicepath);

Що я повинен робити, щоб укомплектувати всі ці бібліотеки DLL у свій EXE?

Відповіді:


120

У вас є кілька варіантів:

  • скористайтеся ILMerge (безкоштовно)
    Для того, як дивитись тут і тут

АБО

  • використовуйте такий інструмент, як 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 AWESOME !!
Ерік Лабашоскі

4
Я не можу повірити, як це просто. Просто встановіть пакунки з nuget, і все готово.
iraSenthil

2
Я також використовую Costura.Fody. Налаштування тривіальне, а включення пакунків NuGet як ресурси - мертве. Отримати проект.
Майкл Сільвер

1
@ user3700562, ця техніка не створює нових збірок, а швидше вбудовує одну або декілька згаданих збірок в існуючу.
CodeFox

1
Чудове рішення! Я використовую його з року і не мав проблем. Але зверніть увагу, що він включає лише збірки, на які посилається ваш найкращий проект. Якщо ваш додаток посилається на інший проект, який посилається на сторонні збори, вам потрібно додати його до проекту верхнього рівня.
Демір


3

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

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

Він об'єднує всі бібліотеки DLL з позначкою "Копіювати локально" = true і створює об'єднаний файл .EXE (поряд із стандартним висновком, більшість з яких зараз не потрібен), який також стискається. Потім це можна використовувати окремо.

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

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


2

Витягує ServiceStack.Gap проект , який показує кілька прикладів МЕТОДИЧНІ ILMerge ServiceStack в один крос-платформної EXE - файл .

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

  • Дозволяє самостійно розміщувати ваші служби за допомогою HTTP-прослуховувача .NET
  • Підтримує попередньо складені Razor Views
  • Підтримує вбудовані ресурси
  • Підтримує вбудовану базу даних у 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-архів, а потім розпаковує його в папку користувача під час спроби запустити програму.
Jesper
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.