Winform/wpf разработката неизбежно се отнася до много трети страни DLL, но всеки път, когато ги опаковате, трябва да копирате файловете в Debug директорията на клиента или да ги споделите, което не е много удобно за използване. Пробвал съм няколко софтуера за сливане на 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\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.
Накрая, изтеглете изходния код в текста:
Туристи, ако искате да видите скритото съдържание на този пост, моля Отговор
|