Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 219600|Отговор: 43

[WinForm] .net/c# Използвайте Costura.Fody за пакетиране на DLL в EXE

[Копирай линк]
Публикувано в 14.04.2018 г. 14:41:49 ч. | | | |
Winform/wpf разработката неизбежно се отнася до много трети страни DLL, но всеки път, когато ги опаковате, трябва да копирате файловете в Debug директорията на клиента или да ги споделите, което не е много удобно за използване. Пробвал съм няколко софтуера за сливане на 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\Newtonsoft.Json.dll'
1> Фоди: Завърши Фоди 609ms.
1> Fody: Пропуснах Verifying assembly, тъй като е изключен в конфигурацията
1> Фоди: Завърших верификацията за 3ms.
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.

Виждайки това, може да се запитате, кога е внедрен методът Attach?

Всъщност, за езика C#, CLR крие голям трик – CLR може да изпълни някакъв инициализиран код преди всеки модул (всеки асемблер съдържа един или повече модули) да бъде зареден. За съжаление, езикът C# няма контрол върху тази част от кода. Fody.Costura инжектира IL код директно във функцията за инициализация на вътрешния модул на EXE асемблера, и тази част от IL кода всъщност изпълнява метода Attach. По този начин, след като EXE асемблерът се зареди, методът Attach може да бъде извикан веднага.

Горното е кратко въведение в принципа на прилагане на Fody.Costura.


Разширена конфигурация

Тези конфигурации се добавят или променят в CosturaFodyWeavers.xml файлове.

СъздавайВременниСъбрания
По подразбиране: false
Това вгражда вградения файл в диска преди да го зареди в паметта. Това е полезно за определени ситуации, когато искате да заредите асемблер от физически файл.

Включи DebugSymbols
По подразбиране: вярно
Контролира дали .pdb файловете на референтния асемблер също са вградени.

DisableCompression
По подразбиране: false
Вградените сглобки по подразбиране се компресират и не компресират при зареждане. Можете да изключите компресията чрез тази опция.
Забележка: Не забравяйте да изключите това свойство, когато се позовавате на нестандартни DLL или криптирани DLL. В противен случай това ще доведе до ситуация, в която exe файлът не може да бъде отворен. Това беше открито, докато използвах DSkin.dll.

DisableCleanup
По подразбиране: false
Като част от Costura, вградените компоненти вече не са включени в билда. Това почистване може да се изключи.

LoadAtModuleInit
По подразбиране: вярно
Costura се зарежда по подразбиране като част от инициализацията на модула. Флагът деактивира поведението. Уверете се, че можете да използвате CosturaUtility.Initialize() някъде.

ExcludeAssemblies
Как да използвам: ExcludeAssemblies="DLL1| DLL2"
Списък с имена на асембли, които да изключите от стандартното действие "embed all copy local references".

ВключванеСъбрания
Как да използвам: 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 във вашия собствен код.Това е основно за ситуации, в които програмата за инициализация на модули не работи, като библиотеки и Mono.


Накрая, изтеглете изходния код в текста:

Туристи, ако искате да видите скритото съдържание на този пост, моляОтговор





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

Ако е лесен за използване, не забравяйте да го похвалите! Хаха, това, просто добави Dll към ресурсния файл, просто и практично! (Не разбирам, мога да измисля урок) @小渣渣

 Хазяин| Публикувано в 6.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 module, Disposable'1 stream, WriterParameters Parameters)
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 ms.


Изглежда няма решение, вижте статията:

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

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


Не разчитайте на силни имена, за да останете в безопасност.

Затова изглежда безсмислено да се прави допълнителен труд, за да се защити нещо, което не е функция за сигурност

 Хазяин| Публикувано в 17.04.2018 г. 13:02:12 ч. |
xxhh Публикувано на 2018-4-17 11:35
След като инсталирах Costura.Fody директно в сравнение с NuGet, плъзнах Windows Media Playe плейър, за да генерирам два вградени dll-а за изтриване или докладване ...

Контролите на Windows Media Player са комуникационни компоненти, не знам дали "Costura.Fody" ги поддържа.

1: Трябва да проверите дали "Costura.Fody" поддържа "com компоненти"
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 Публикувано на 2018-4-17 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 в сравнение с 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 Публикувано на 17.04.2018 17:42
Наемодателят или мен, искам да попитам, поставям видеото в вградения ресурс и това, което показва, е байтов масив, има ли начин да го сложа в плейъра и да го пусна директно ( ...

Не се препоръчва да се превръща голямо видео в ресурсен файл, можете да проверите дали има друг начин плейърът да предава директно в байт[]
Публикувано в 18.04.2018 г. 8:08:48 ч. |
Xiao Zhazha Публикувано на 2018-4-17 20:52
Не се препоръчва да се превръща голямо видео в ресурсен файл, можете да видите дали има друг начин плейърът да предава директно в байт[] ...

Никой от тях не чете видео адреси и не иска да ви попита какви добри идеи имате
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com