Как пакет Fody NuGet объединяет сборки в конце процесса компиляции? - PullRequest
0 голосов
/ 05 июля 2018

Недавно я наткнулся на пакет NuGet для изменения сборок .NET, в частности, был установлен плагин Costura NuGet для пакета Fody, который объединяет сборки после завершения компилятора C #.

Мне не удалось найти какие-либо изменения в файле .csproj (кроме импорта NuGet), которые показывают задачу, которая выполняется после сборки сборки.

Я хотел бы знать, как Fody может запускать код после сборки без каких-либо заметных изменений конфигурации.

1 Ответ

0 голосов
/ 05 июля 2018

Fody добавляет этот .targets файл в ваш проект. Если у вас есть классический проект NET Framework, вы увидите, что он добавлен в файл .csproj. Если у вас есть нестандартный проект (новый формат проекта), он автоматически выбирается во время сборки непосредственно из пакета nuget, поэтому вы не увидите его в проекте (но вы увидите его в папке \ obj \, слегка переименованной) ,

Упрощено: эта цель выполняется после цели "AfterCompile". Он ищет файл Weavers.xml. Для каждого ткача (например, Костура), который он находит в списке, он вызывает собрание ткача. Ткачи используют инфраструктуру Fody, основанную на Mono / Cecil, для обработки IL вашей сборки, последующей сборки и перезаписи IL.

В случае с Costura (опять же, упрощенно) каждая справочная сборка превращается во встроенный ресурс. Затем он добавляет Module Initializer к вашей сборке. Инициализатор модуля (что-то, что вы не можете написать на чистом c #) гарантированно будет запущен до вызова любого кода в вашей сборке - думайте об этом как о статическом конструкторе, но для сборки.

Код, который он добавляет к инициализатору модуля, прикрепляет AssemblyResolveEvent к AppDomain. Этот обработчик будет использовать поток ресурсов манифеста для удовлетворения разрешения сборок, встроенных Costura, путем вызова Assembly.Load с использованием байтов из потока. Затем он возвращает этот Assembly объект из обработчика, тем самым удовлетворяя разрешению сборки. При желании, Costura может извлечь DLL-файлы во временную папку на диске, а затем использовать этот путь для удовлетворения разрешения (иногда это необходимо в зависимости от используемых DLL-библиотек).

Документация Fody и Costura объясняет, как это работает в деталях.

...