Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 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> 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 у власному коді.Це переважно стосується ситуацій, коли програма ініціалізації модулів не працює, наприклад, бібліотеки та моно.


Нарешті, завантажте вихідний код у тексті:

Туристи, якщо ви хочете побачити прихований контент цього допису, будь ласкаВідповідь





Попередній:Рішення StreamReader для спотворених символів під час читання файлів
Наступний:Рішення конфліктів між Hyper-V, VirtualBox і VMware
Опубліковано 07.06.2018 09: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 parameters)
1>MSBUILD: помилка: У InnerWeaver.WriteModule() позиція C:\projects\fody\FodyIsolated\ModuleWriter.cs: рядок номер 18
1>MSBUILD: помилка: In 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 Опубліковано 2018-4-17 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 Опубліковано 2018-4-17 10:33
Власник хоче запитати, чи можу я об'єднати відео та dll у exe-плагін
...

Ви можете це зробити: встановіть властивість відео на «Вбудовані ресурси», а потім прочитайте файл ресурсу.
Опубліковано 17.04.2018 11:35:51 |
Сяо Чжао опублікувало 2018-4-17 11:16
Ви можете це зробити: встановіть властивість відео на «Вбудовані ресурси», а потім прочитайте файл ресурсу. ...

Я перетягнув плеєр Windows Media Playe одразу після встановлення Costura.Fody у vs NuGet і створив два вбудовані DLL для видалення або повідомлення про помилку  
Опубліковано 17.04.2018 11:57:09 |
Чи все ще потрібно встановлювати XML?     
Опубліковано 17.04.2018 17:42:31 |
Сяо Чжао опублікувало 2018-4-17 11:16
Ви можете це зробити: встановіть властивість відео на «Вбудовані ресурси», а потім прочитайте файл ресурсу. ...

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

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

Жоден із них не читає відеозвернення і не хоче запитати, які у вас хороші ідеї є
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com