Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 219600|Ответ: 43

[WinForm] .net/c# Используйте Costura.Fody для упаковки DLL в EXE

[Скопировать ссылку]
Опубликовано 14.04.2018 14:41:49 | | | |
Разработка Winform/wpf неизбежно относится к многим сторонним DLL, но каждый раз, когда вы их упаковываете, нужно скопировать файлы из каталога отладки клиенту или поделиться ими, что не очень удобно в использовании. Я пробовал несколько программ для объединения dll-файлов, таких как ILMerge, Enigma Virtual Box и др., но пока не узнал о «Costura.Fody», мне казалось, что мир стал намного лучше~

Ниже приведена программа, написанная Winform, ссылающаяся на два DLL — «HttpHelper.dll» и «Newtonsoft.Json.dll»; при генерации программы будет exe-файл и эти два DLL-файла, что вызывает у людей сильный дискомфорт, и если на один DLL меньше, программа может сообщить об исключении, как показано на рисунке ниже:



Ссылка ниже — предыдущее использование (не рекомендуется)

C# упаковывает dll в программу exe
http://www.itsvse.com/thread-2841-1-1.html
(Источник: Architect_Programmer)



Используя инструмент 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 в вашем собственном коде.Это в основном касается случаев, когда программа инициализации модуля не работает, например, библиотеки и моно.


Наконец, скачайте исходный код в тексте:

Туристы, если вы хотите увидеть скрытое содержание этого поста, пожалуйстаОтвет





Предыдущий:Решение StreamReader для искажённых символов при чтении файлов
Следующий:Решения конфликтов между Hyper-V и VirtualBox и VMware
Опубликовано 07.06.2018 9:35:19 |
Попробуйте этот метод интеграции компонента зависимостей Dll в компилируемый на C# EXE!

Если им легко пользоваться, не забудьте похвалить его! Ха-ха, вот так, просто добавь Dll в ресурсный файл, просто и практично! (Я не понимаю, могу придумать туториал) @小渣渣

 Хозяин| Опубликовано 06.06.2018 10:30:42 |
Если вы подпишете программу, вы получите следующую ошибку:

1>MSBUILD : ошибка : Fody: Возникло необработанное исключение:
1>MSBUILD : ошибка : Исключение:
1>MSBUILD: ошибка: Не удаётся получить публичный ключ для StrongNameKeyPair.
1>MSBUILD : ошибка : StackTrace:
1>MSBUILD: ошибка: при System.Reflection.StrongNameKeyPair.ComputePublicKey()
1>MSBUILD: ошибка: в System.Reflection.StrongNameKeyPair.get_PublicKey()
1>MSBUILD: ошибка: в Mono.Cecil.ModuleWriter.WriteModuleTo(модуль ModuleDefinition, поток Disposable'1, параметры WriterParameters)
1>MSBUILD: ошибка: в Mono.Cecil.ModuleDefinition.Write (String fileName, параметры WriterParameters)
1>MSBUILD: ошибка: в InnerWeaver.WriteModule() позиция C:\projects\fody\FodyIsolated\ModuleWriter.cs: строка номер 18
1>MSBUILD: ошибка: В InnerWeaver.Execute() позиция C:\projects\fody\FodyIsolated\InnerWeaver.cs: строка номер 86
1>MSBUILD : ошибка : Источник:
1>MSBUILD : ошибка : mscorlib
1>MSBUILD : ошибка : TargetSite:
1>MSBUILD : ошибка : Byte[] ComputePublicKey()
1>MSBUILD : ошибка :
1> Фоди: Финишировал на Фоди 551 мс.


Похоже, решения нет, см. статью:

https://github.com/Fody/ExtraConstraints/issues/5

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


Не полагайтесь на сильные имена, чтобы оставаться в безопасности.

Поэтому кажется бессмысленным делать дополнительные усилия, чтобы защитить что-то, что не является функцией безопасности

 Хозяин| Опубликовано 17.04.2018 13:02:12 |
xxhh Опубликовано 17.04.2018 11:35
После установки Costura.Fody напрямую в NuGet, я перетащил плеер Windows Media Playe, чтобы сгенерировать два встроенных dll для удаления или сообщения ...

Управление Windows Media Player — это ком-компоненты, не знаю, поддерживает ли их "Costura.Fody".

1: Стоит проверить, поддерживает ли «Costura.Fody» «ком-компоненты»
2: Игнорируйте два DLL, которые в упаковке, а для того, как нужно задать XML, пожалуйста, обратитесь к официальной документации для подробностей
Опубликовано 17.04.2018 10:29:52 |
Скачайте, чтобы увидеть конфигурацию XML
Опубликовано 17.04.2018 10:33:34 |
Владелец хочет спросить, могу ли я собрать видео и dll вместе в exe-плагин
 Хозяин| Опубликовано 17.04.2018 11:16:15 |
xxhh Опубликовано 17.04.2018 10:33
Владелец хочет спросить, могу ли я собрать видео и dll вместе в exe-плагин
...

Вы можете так сделать: можно установить свойство видео на «Embedded Resources» и затем прочитать файл ресурса.
Опубликовано 17.04.2018 11:35:51 |
Xiao Zhao опубликовал 2018-4-17 11:16
Вы можете так сделать: можно установить свойство видео на «Embedded Resources» и затем прочитать файл ресурса. ...

Я перетащил плеер Windows Media Playe сразу после установки Costura.Fody vs NuGet и создал два встроенных dll, чтобы удалить или сообщить об ошибке  
Опубликовано 17.04.2018 11:57:09 |
Нужно ли всё ещё устанавливать XML?     
Опубликовано 17.04.2018 17:42:31 |
Xiao Zhao опубликовал 2018-4-17 11:16
Вы можете так сделать: можно установить свойство видео на «Embedded Resources» и затем прочитать файл ресурса. ...

Арендодатель или я, хочу спросить: я вставляю видео в встроенный ресурс, то, что отображается, — это байтовый массив — есть ли способ ввести его в плеер и воспроизвести напрямую (я не хочу записывать в локальный канал для воспроизведения по пути чтения, видео — это не только большая карта).
 Хозяин| Опубликовано 17.04.2018 20:52:16 |
xxhh Опубликовано 2018-4-17 17:42
Арендодатель или я, хочу спросить, я вставляю видео в встроенный ресурс, и там отображается байтовый массив — есть ли способ вставить его в плеер и воспроизвести напрямую ( ...

Не рекомендуется превращать большое видео в ресурсный файл, вы можете посмотреть, есть ли другой способ для игрока напрямую передавать байты[]
Опубликовано 18.04.2018 8:08:48 |
Сяо Чжажа Опубликовано 2018-4-17 20:52
Не рекомендуется превращать большое видео в ресурсный файл, можно посмотреть, есть ли другой способ для игрока напрямую передавать данные в байте[] ...

Никто из них не читает видеообращения и не хочет спросить, какие у тебя хорошие идеи
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com