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

Вид: 59779|Відповідь: 9

[Джерело] «Динамічна заміна» для .NET плагінів

[Копіювати посилання]
Опубліковано 2021-8-15 21:55:14 | | |
Уявіть собі сценарій, коли наша система обслуговування надає низку функціональних сервісів, і в майбутньому буде додано ще більше нових функціональних сервісів, і функціональні сервіси можуть знадобитися змінити або прибрати. Поширеною базовою вимогою для такої сервісної системи є те, що її роботу не можна зупинити при доданні/видаленні/оновленні функціональних сервісів. Зазвичай «плагіни для гарячої заміни» можна реалізувати дуже просто, інкапсулюючи кожен сервіс у плагін-dll, але «гаряча заміна» («динамічна заміна») плагінів стає проблемою. Причина в тому, що коли ми видаляємо плагін Dll із сервісної системи, сервісна система все ще зберігає базове посилання на DLL, і якщо ви спробуєте видалити або перезаписати DLL, Windows з'явиться повідомлення на кшталт «використовується DLL».

Отже, як вирішити цю проблему? Я думаю, є принаймні два варіанти:

(1) Використовуйте AppDomain. Завантаження плагінів у новий AppDomain і подальше видалення AppDomain чисто видаляє плагін dll з сервісної системи. Недоліком цього підходу є те, що потрібно керувати багатьма AppDomains (бо у вас дуже багато функціональних сервісів), а комунікація між AppDomains здійснюється віддалено, що створює багато зайвих проблем у нашій системі. Якщо цікаво, можете спробувати цей варіант, а я віддаю перевагу другому.

(2) Скопіюйте плагін Dll у пам'ять, а потім завантажте Dll у пам'ять. Таким чином, DLL на жорсткому диску можна перезаписувати або видаляти за бажанням. Раніше ми завантажували плагін Dll безпосередньо з жорсткого диска, ось так:

Тепер нам потрібно змінити ситуацію:


Це вирішує проблему «динамічної заміни» плагінів.





Попередній:Spring Cloud записує всі журнали інтерфейсу запитів у MongoDB
Наступний:.NET/C# перетворює підкреслені назви полів у великі форми горба
Опубліковано 2021-8-15 23:11:28 |
Такий великий проєкт, краще перезапускати сервер вночі...
Опубліковано 2021-8-17 14:43:41 |
Дякую, що поділилися!~'
Опубліковано 2021-9-16 18:25:58 |
Відповіді на тести
Опубліковано 2021-9-17 21:39:18 |
Вивчи це
Опубліковано 2021-9-18 19:05:29 |
Цей допис востаннє відредаговано fyxh66 2021-9-18 19:07

System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。”IL 格式不正确。
  • var dll = Assembly.Load(addinStream);
86 теж намагався, ні @小slag Бос має час допомогти подивитися
 Орендодавець| Опубліковано 2021-9-18 22:08:32 |
fyxh66 опубліковано 2021-9-18 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

З такою проблемою не стикався.

Є дві ситуації, коли виникає виняток System.BadImageFormatException: цільова платформа програми є несумісною, > системна платформа референтного dll-файлу є несумісною.

Перевірка: Чи є .NET-версії основної програми та плагін-dll послідовними, а цільова платформа — узгодженою, чи DLL-файли не розроблені на .NET?
Опубліковано 2021-9-19 16:17:56 |
Опубліковано 2021-9-18 22:08
З такою проблемою не стикався.

Існує дві ситуації, коли виникає виняток System.BadImageFormatException: цільова платформа програми неузгоджена > референсним dll ...

Так, c++ dll...
 Орендодавець| Опубліковано 2021-9-19 17:01:33 |

Це точно не добре, динамічний плагін тут може завантажувати лише .NET DLL, а DLL, що викликають C++, не налаштовуються таким чином
Опубліковано 2021-9-19 18:54:53 |
Xiaozha Опубліковано 2021-9-19 17:01
Це точно не добре, динамічний плагін тут може завантажувати лише .net DLL, а DLL, що викликають C++, не налаштовані так...

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

Mail To:help@itsvse.com