Разработка Winform/wpf неизбежно относится к многим сторонним DLL, но каждый раз, когда вы их упаковываете, нужно скопировать файлы из каталога отладки клиенту или поделиться ими, что не очень удобно в использовании. Я пробовал несколько программ для объединения dll-файлов, таких как ILMerge, Enigma Virtual Box и др., но пока не узнал о «Costura.Fody», мне казалось, что мир стал намного лучше~
Ниже приведена программа, написанная Winform, ссылающаяся на два DLL — «HttpHelper.dll» и «Newtonsoft.Json.dll»; при генерации программы будет exe-файл и эти два DLL-файла, что вызывает у людей сильный дискомфорт, и если на один DLL меньше, программа может сообщить об исключении, как показано на рисунке ниже:
Ссылка ниже — предыдущее использование (не рекомендуется)
Используя инструмент Costura.Fody, вы можете объединить исходный DLL с целевым EXE
Главная страница проекта: https://github.com/Fody/Costura
Как пользоваться, напрямую устанавливать пакет nuget:
После успешного добавления Costura.Fody решение автоматически добавит FodyWeavers.xml файл.
Перегенерируйте решение, вы увидите успех в каталоге генерации программ, все DLL-файлы идеально объединены с exe, вы можете напрямую скопировать exe-файл в клиент для самостоятельного запуска. Как показано ниже:
1>------ Все пересборки запущены: Проект: itsvse, Конфигурация: Отладка Любой процессор ------ 1> Fody: Fody (версия 2.0.0.0) Выполнение 1> Фоди/Костура: Упоминания о «Costura.dll» не найдено. Ссылки не изменены. 1> Fody/Costura: Встраивание 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Встраивание 'E:\project\itsvse\itsvse\itsvse\Newtonsoft.Json.dll' 1> Фоди: Завершил Фоди 609 мс. 1> Fody: пропустил верификацию сборки, так как он отключён в конфигурации 1> Фоди: Проверка прошла за 3 мс. 1> itsvse -> E:\project\itsvse\itsvse\bin\Debug\itsvse.exe ========== Регенерировать все: 1 успешно, 0 провал, 0 ========== пропущено
Как видно на приведённой выше фотографии, сгенерированный файл не содержит Newtonsoft.Json.dll, HttpHelper.dll и Costura.dll не генерируются, а только два файла, itsvse.exe можно запускать напрямую без ошибок! (Файл PDB можно удалить).
Давайте воспользуемся инструментом ILSpy для декомпиляции нашей программы и рассмотрим сгенерированный исходный код, как показано на рисунке ниже:
Введение в принцип реализации
Когда CLR пытается загрузить ассемблер, но не загружается, возникает событие AppDomain.AssemblyResolve. Наша программа может слушать это событие и возвращать ассемблер, который CLR пытается загрузить в обработчик событий, чтобы программа могла продолжать работать нормально.
Fody.Costura встраивает все DLL, на которые ссылается EXE, в EXE-файл при создании проекта. Когда программа использует один из этих DLL во время выполнения (событие AppDomain.AssemblyResolve запускается, потому что CLR не может найти DLL-файл), необходимая DLL извлекается из встроенных ресурсов EXE-файла.
Видно, что метод Attach прослушивает событие AppDomain.AssemblyResolve. Если CLR не загружает сборку успешно, выполняется обработчик событий AssemblyResolve. AssemblyResolve пытается получить целевую сборку из встроенного ресурса загруженной ассембли через метод Common.ReadFromEmbeddedResources и возвращает её в CLR.
Видя это, вы можете спросить: когда был реализован метод Прикрепления?
На самом деле, для языка C# CLR скрывает большой трюк — CLR может выполнить инициализированный код до загрузки каждого модуля (каждый ассемблер содержит один или несколько модулей). К сожалению, язык C# не контролирует эту часть кода. Fody.Costura вводит код IL напрямую в функцию инициализации внутреннего модуля EXE-ассембли, и эта часть кода IL фактически выполняет метод Attached. Таким образом, после загрузки EXE-сборки метод Attach можно вызвать сразу.
Приведённое выше краткое введение в принцип реализации Fody.Costura.
Расширенная конфигурация
Эти конфигурации добавляются или изменяются в CosturaFodyWeavers.xml файлах.
СоздатьВременныеАссамблеи По умолчанию: false Это встраивает встроенный файл в диск перед загрузкой в память. Это полезно в определённых ситуациях, когда нужно загрузить ассембл из физического файла.
Включить DebugSymbols По умолчанию: верно Контролирует, встраиваются ли также .pdbs эталонной сборки.
DisableCompression По умолчанию: false Встроенные сборки по умолчанию сжимаются и не сжаты при загрузке. С помощью этой опции можно отключить компрессию. Примечание: обязательно отключите это свойство при упоминании нестандартных или зашифрованных DLL. В противном случае это приведёт к ситуации, когда экс-файл нельзя открыть. Это обнаружили, когда я использовал DSkin.dll.
DisableCleanup По умолчанию: false В составе Costura встроенные компоненты больше не входят в сборку. Эту уборку можно отключить.
LoadAtModuleInit По умолчанию: верно Costura загружается по умолчанию как часть инициализации модуля. Флаг отключает это поведение. Убедитесь, что вы можете использовать CosturaUtility.Initialize() где-нибудь.
ExcludeAssemblies Как использовать: ExcludeAssemblies="DLL1| DLL2" Список имён ассемблеров, которые нужно исключить из действия по умолчанию «вставить все локальные ссылки копии».
ВключатьАссамблеи Как использовать: IncludeAssemblies="DLL1| DLL2" Список имён ассемблеров, включённых в действие по умолчанию Embedding All Copy Local References.
Unmanaged32Assemblies&Unmanaged64Assemblies Как им пользоваться: Unmanaged32Assemblies="DLL1| DLL2" Unmanaged64Assemblies="DLL1| DLL2" Сборки смешанного режима нельзя загружать так же, как управляемые сборки. Поэтому, чтобы помочь Costura определить, какие компоненты находятся в смешанном режиме и в каких средах их загрузить, их имена следует включать в один или оба списка. Не включайте .exe или .dll в название.
Предзагрузочный заказ Использование: PreloadOrder="DLL1| DLL2" Локальные библиотеки могут автоматически загружаться Costura. Чтобы включить локальную библиотеку, включите её в проект в виде встроенного ресурса, называемого папкой costura32 или costura64, в зависимости от нестабильности библиотеки. В качестве альтернативы можно указать порядок загрузки, в котором загружаются предзагруженные библиотеки. Когда вы смешиваете временные компоненты с диска, они тоже заранее загружаются.
CosturaUtility Как использовать:
CosturaUtility — это класс, который позволяет вручную инициализировать систему Costura в вашем собственном коде.Это в основном касается случаев, когда программа инициализации модуля не работает, например, библиотеки и моно.
Наконец, скачайте исходный код в тексте:
Туристы, если вы хотите увидеть скрытое содержание этого поста, пожалуйста Ответ
|