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

Изглед: 59779|Отговор: 9

[Източник] "Динамична замяна" на .NET плъгини

[Копирай линк]
Публикувано на 2021-8-15 21:55:14 | | |
Представете си сценарий, в който нашата система за услуги предоставя серия от функционални услуги, а в бъдеще ще бъдат добавени още нови функционални услуги, като функционалните услуги може да се наложи да бъдат променени или премахнати. Често срещано основно изискване за такава система за услуги е, че работата на системата не може да бъде прекратена при добавяне/премахване/актуализиране на функционални услуги. Обикновено "hot-swapping плъгините" могат да се реализират много лесно чрез капсулиране на всяка услуга в 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 |
Сяожа Публикувано на 2021-9-19 17:01
Това определено не е добре, динамичният плъгин тук може да зарежда само .net DLL-ове, а DLL-ите, които викат C++, не са настроени така...

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

Mail To:help@itsvse.com