Розробка 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> Fody/Costura: Жодних згадок про «Costura.dll» не знайдено. Посилання не змінено. 1> Fody/Costura: Вбудовування 'E:\project\itsvse\itsvse\HttpHelper.dll' 1> Fody/Costura: Вбудовування 'E:\project\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 фактично виконує метод Attage. Таким чином, після завантаження EXE-асемблеру метод Attach можна викликати одразу.
Вищенаведене — короткий вступ до принципу впровадження Fody.Costura.
Розширена конфігурація
Ці конфігурації додаються або змінюються у CosturaFodyWeavers.xml файлах.
СтворитиТимчасовіАсамблеї За замовчуванням: false Це вбудовує вбудований файл на диск перед завантаженням у пам'ять. Це корисно для певних ситуацій, коли потрібно завантажити асемблер із фізичного файлу.
IncludeDebugSymbols За замовчуванням: true Контролює, чи також вбудовані .pdbs референтної асембли.
DisableCompression За замовчуванням: false Вбудовані збірки за замовчуванням стискаються і не стискаються при завантаженні. Ви можете вимкнути компресію за допомогою цієї опції. Примітка: обов'язково вимикайте цю властивість при посиланні на нестандартні DLL або зашифровані DLL. Інакше це призведе до ситуації, коли exe не можна відкрити. Це було виявлено, коли я користувався DSkin.dll.
DisableCleanup За замовчуванням: false Як частина Costura, вбудовані компоненти більше не входять до складу збірки. Це прибирання можна вимкнути.
LoadAtModuleInit За замовчуванням: true 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. Щоб включити локальну бібліотеку, включите її у свій проєкт як вбудований ресурс під назвою folder costura32 або costura64 залежно від нестабільності бібліотеки. Альтернативно, можна вказати порядок завантаження, у якому попередньо завантажені бібліотеки. Коли ви мікшуєте тимчасові компоненти з диска, вони також попередньо завантажуються.
CosturaUtility Як користуватися:
CosturaUtility — це клас, який дозволяє вручну ініціалізувати систему Costura у власному коді.Це переважно стосується ситуацій, коли програма ініціалізації модулів не працює, наприклад, бібліотеки та моно.
Нарешті, завантажте вихідний код у тексті:
Туристи, якщо ви хочете побачити прихований контент цього допису, будь ласка Відповідь
|