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 объясняет, как это работает в деталях.