ILMerge Best Practices

Вы используете ILMerge? Используете ли вы ILMerge для объединения нескольких сборок, чтобы упростить развертывание DLL? Нашли ли вы проблемы с развертыванием / управлением версиями в рабочей среде после сборок ILMerging вместе?

Я ищу несколько советов относительно использования ILMerge для уменьшения трения при развертывании, если это вообще возможно.

13.08.2008 01:05:47
12 ОТВЕТОВ
РЕШЕНИЕ

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

Вы не можете ILMerge любые сборки C ++, которые имеют собственный код. Вы также не можете ILMerge какие-либо сборки, которые содержат XAML для WPF (по крайней мере, я не имел никакого успеха с этим). Во время выполнения он жалуется, что ресурсы не могут быть найдены.

Я написал исполняемый файл оболочки для ILMerge, в котором я передаю имя exe запуска для проекта, который я хочу объединить, и имя exe вывода, а затем оно отражает зависимые сборки и вызывает ILMerge с соответствующими параметрами командной строки. Теперь намного проще, когда я добавляю новые сборки в проект, мне не нужно забывать обновлять скрипт сборки.

42
30.08.2010 13:16:54
Как вы сделали интеграцию сборки релиза?
Svish 30.10.2009 08:09:45
Sean Gough 3.02.2010 16:17:26
Вот потенциальный обходной путь для ILMerge + XAML: richarddingwall.name/2009/05/14/…
scobi 13.08.2010 00:04:02
roman.st/Article/ILMerge-and-GeneratedInternalTypeHelper - еще один обходной путь для ILMerge + XAML
Prat 13.09.2013 13:36:21
@Lamar Не могли бы вы поделиться этой упаковкой .exe для ILMerge?
florien 19.09.2017 05:51:25

Мы используем ILMerge на многих проектах. Web Service Software Factory , например , производит что - то вроде 8 сборок , как его выход. Мы объединяем все эти библиотеки DLL в одну библиотеку, так что хост службы должен ссылаться только на одну библиотеку DLL.

Это делает жизнь несколько проще, но это не имеет большого значения.

3
13.08.2008 04:31:44

Мы используем ILMerge в блоках приложения Microsoft - вместо 12 отдельных файлов DLL у нас есть один файл, который мы можем загрузить в наши клиентские области, плюс структура файловой системы намного лучше.

После объединения файлов мне пришлось отредактировать список проектов Visual Studio, удалить 12 отдельных сборок и добавить один файл в качестве ссылки, в противном случае он будет жаловаться, что не может найти конкретную сборку. Я не слишком уверен, как это будет работать после развертывания, хотя, возможно, стоит попробовать.

10
14.08.2008 13:00:50

Мы только начали использовать ILMerge в наших решениях, которые перераспределяются и используются в других наших проектах и ​​пока что хороши. Кажется, все работает хорошо. Мы даже запутали упакованную сборку напрямую.

Мы рассматриваем возможность сделать то же самое со сборками MS Enterprise Library.

Единственная реальная проблема, с которой я сталкиваюсь, - это версия отдельных сборок из пакета.

0
14.08.2008 13:04:08

Мы столкнулись с проблемами при объединении библиотек DLL, которые имеют ресурсы в одном и том же пространстве имен. В процессе объединения одно из пространств имен ресурсов было переименовано, и поэтому ресурсы не могли быть найдены. Может быть, мы просто делаем что-то не так, все еще расследуя проблему.

1
19.08.2009 11:43:20

У меня недавно была проблема, когда я погрузил сборку в сборку, у меня было несколько классов, которые вызывались через отражение в CMS с открытым исходным кодом Umbraco.

Информация для вызова через отражение была взята из таблицы базы данных, в которой было имя сборки и пространство имен реализованного класса и интерфейса. Проблема заключалась в том, что при отражении dll вызов рефлексии не удался, однако, если dll был отделен, все работало нормально. Я думаю, что проблема может быть похожа на то, что имеет longeasy?

0
30.07.2010 14:35:05

Мне кажется, что лучшей практикой ILMerge № 1 является «Не используйте ILMerge». Вместо этого используйте SmartAssembly . Одна из причин этого заключается в том, что передовая практика ILMerge №2 - всегда запускать PEVerify после выполнения ILMerge, поскольку ILMerge не гарантирует, что он будет правильно объединять сборки в допустимый исполняемый файл.

Другие недостатки ILMerge:

  • при слиянии он удаляет комментарии XML (если бы я заботился об этом, я бы использовал инструмент запутывания)
  • он неправильно обрабатывает создание соответствующего файла .pdb

Еще один инструмент, на который стоит обратить внимание - это Mono.Cecil и Mono.Linker [2].

[2]: http: // www.mono-project.com/Linker

-1
24.08.2010 21:14:23
«он неправильно обрабатывает создание соответствующего файла .pdb» - при каких условиях это правда? Я наблюдал, как ILMerge генерирует объединенные файлы pdb, и использовал их без проблем.
scobi 25.08.2010 16:18:42
Когда какая-либо из сборок, которые вы хотите объединить, еще не имеет .pdb. Кроме того, SmartAssembly правильно обрабатывает ресурсы WPF, такие как BAML.
user429921 25.08.2010 23:26:43
Большое преимущество ILMerge перед Smartassembly заключается в том, что он объединяет файлы документации XML. Smartassembly не будет делать это с даты публикации. - Платный пользователь Smartassembly
Cameron 19.03.2015 01:31:42

Вступление

Этот пост показывает, как заменить все .exe + .dll filesна один combined .exe. Он также сохраняет .pdbфайл отладки без изменений.

Для консольных приложений

Вот основные Post Build Stringдля Visual Studio 2010 SP1, используя .NET 4.0. Я строю консоль .exe со всеми вложенными .dll файлами, включенными в него.

"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards

Основные советы

  • Выводом является файл " AssemblyName.all.exe", который объединяет все вложенные файлы в один .exe.
  • Обратите внимание на ILMerge\каталог. Вам нужно либо скопировать утилиту ILMerge в каталог вашего решения (чтобы вы могли распространять исходный код, не беспокоясь о документировании установки ILMerge), либо изменить этот путь, указав, где находится ILMerge.exe.

Расширенные советы

Если у вас есть проблемы с ним не работает, включите Outputи выберите Show output from: Build. Проверьте точную команду, сгенерированную Visual Studio, и проверьте на наличие ошибок.

Образец скрипта сборки

Этот скрипт заменяет все .exe + .dll filesодним combined .exe. Он также сохраняет файл отладки .pdb без изменений.

Чтобы использовать его, вставьте его в свой Post Buildшаг на Build Eventsвкладке в проекте C # и убедитесь, что вы скорректировали путь в первой строке, чтобы он указывал на ILMerge.exe:

rem Create a single .exe that combines the root .exe and all subassemblies.
"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards
rem Remove all subassemblies.
del *.dll
rem Remove all .pdb files (except the new, combined pdb we just created).
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).all.pdb.temp"
del *.pdb
ren "$(TargetDir)$(TargetName).all.pdb.temp" "$(TargetName).all.pdb"
rem Delete the original, non-combined .exe.
del "$(TargetDir)$(TargetName).exe"
rem Rename the combined .exe and .pdb to the original project name we started with.
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).pdb"
ren "$(TargetDir)$(TargetName).all.exe" "$(TargetName).exe"
exit 0
41
30.01.2017 17:01:38
Contango 20.03.2012 10:32:05
Как вы показываете выход из сборки? У меня тихая проблема с записью вывода. stackoverflow.com/questions/42301103/…
octopusgrabbus 17.02.2017 15:34:00
@octopusgrabbus В Visual Studio выберите View.. Output, выберите Build, и он показывает вывод командной строки из компилятора (включая шаги, описанные выше). Или скопируйте эти команды в .batфайл, а затем запустите его из окна DOS, чтобы увидеть результат.
Contango 18.02.2017 16:32:04

Я знаю, что это старый вопрос, но мы не только используем ILMerge для уменьшения количества зависимостей, но и для интернализации «внутренних» зависимостей (например, automapper, restsharp и т. Д.), Используемых утилитой. Это означает, что они полностью удалены, и проекту, использующему объединенную утилиту, не нужно знать о них. Это снова уменьшает количество необходимых ссылок в проекте и позволяет ему использовать / обновлять свою собственную версию той же внешней библиотеки, если это необходимо.

7
3.11.2012 01:53:42

У нас была та же проблема с объединением зависимостей WPF .... Похоже, что ILMerge не справляется с этим. Однако Costura.Fody отлично сработали для нас и заняли около 5 минут, чтобы начать ... очень хороший опыт.

Просто установите с помощью Nuget (выберите правильный проект по умолчанию в консоли диспетчера пакетов). Он внедряется в целевой проект, и настройки по умолчанию сразу сработали для нас.

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

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

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

3
13.04.2016 14:16:48

Я только начинаю использовать ILMerge как часть моей сборки CI, чтобы объединить множество мелкозернистых контрактов WCF в одну библиотеку. Он работает очень хорошо, однако новая объединенная библиотека не может легко сосуществовать со своими библиотеками компонентов или другими библиотеками, которые зависят от этих библиотек компонентов.

Если в новом проекте вы ссылаетесь как на свою библиотеку ILMerged, так и на унаследованную библиотеку, которая зависит от одного из вводимых вами данных ILMerge, вы обнаружите, что вы не можете передать любой тип из библиотеки ILMerged в любой метод в Устаревшая библиотека без какого-либо отображения типов (например, с помощью автоматического преобразователя или вручную). Это потому, что как только все скомпилировано, типы эффективно квалифицируются с именем сборки.

Имена также будут конфликтовать, но вы можете исправить это, используя внешний псевдоним .

Мой совет заключается в том, чтобы не включать в вашу объединенную сборку любую общедоступную библиотеку, которую предоставляет ваша объединенная сборка (например, через тип возврата, параметр метода / конструктора, поле, свойство, generic ...), если вы не уверены, что пользователь ваша объединенная сборка не зависит и никогда не будет зависеть от автономной версии той же библиотеки.

0
29.04.2016 18:41:11

Обратите внимание, что для программ с графическим интерфейсом Windows (например, WinForms) вы захотите использовать ключ / target: winexe .
Ключ / target: exe создает объединенное консольное приложение.

3
28.02.2017 13:36:45