Способы слияния сборок .NET Framework.



Merging assemblies приятная задачка, позволяющая на выходе получить один исполняемый файл или одну dll.

Слияние (мерджинг) сборок можно выполнить двумя основными способами:

  1. Использовать утилиту слияния.
    Самая распространенная и бесплатная утилита, это утилита командной строки ILMerge.
    Чтоб ее использовать, например, бросьте в папку главного проекта ILMerge.exe, потом зайдите в свойства этого проекта и в Buil Events пропишите в поле Post-buid events command line вызов этой утилиты, например так:
    "$(ProjectDir)ilmerge" /out:"$(ProjectDir)!Output\$(TargetFileName)" "$(TargetPath)" "$(TargetDir)Prived.Midved.dll" "$(TargetDir)WindowsProcessManager.dll" del "$(ProjectDir)!Output\$(ProjectName).pdb"
    Где ключ /out указывает куда класть не по умолчанию готовую сборку или экзешник. В нашем случае это будет папка !Output в корне проекта.
    Потом перечисляются сборки, который нужно запихнуть в итоговый файл.
    Команда del в конце, используется для удаления файла “.pdb”.

    Можно изловчиться и сделать так, чтоб слияние отрабатывало только в случае компиляции не для дебаггинга, но я это делал через свой экзешник передавая в командной строке $(ConfigurationName).
    Мнимый недостаток ILMerge то, что сборки теряют свою идентичность – имя, версию, культуру, публичный ключ.
  2. Загрузка сборок в рунтайме по требованию.
    Это более гибкий метод, но также и более подверженный поздним ошибкам.
    Используется внедрение нужных сборок, как ресурсов в основную сборку и потом реагирование на событие AppDomain.CurrentDomain.AssemblyResolve для извлечения сборок из ресурса и загрузки в рантайме.
    Я вам очень советую в случае использования этого способа написать тест, который при старте приложения вызывает по одному типу (методу, члену) из каждой используемой сборки в ресурсе.

Некоторый средства обфускации тоже имеют функцию слияния (точно не помню).

About Ilya Tretyakov, it3xl

Just Google it3xl
This entry was posted in common. Bookmark the permalink.

Leave a comment