ILMerge Best Practices - PullRequest
       49

ILMerge Best Practices

71 голосов
/ 13 августа 2008

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

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

Ответы [ 12 ]

41 голосов
/ 29 августа 2008

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

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

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

40 голосов
/ 20 марта 2012

Введение

В этом посте показано, как заменить все .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
10 голосов
/ 14 августа 2008

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

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

6 голосов
/ 03 ноября 2012

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

3 голосов
/ 28 февраля 2017

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

3 голосов
/ 13 апреля 2016

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

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

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

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

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

3 голосов
/ 13 августа 2008

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

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

1 голос
/ 19 августа 2009

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

0 голосов
/ 29 апреля 2016

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

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

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

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

0 голосов
/ 25 августа 2010

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

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

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

Другим инструментом, на который стоит обратить внимание, является Mono.Cecil и инструмент Mono.Linker [2].

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

...