Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 59779|Răspunde: 9

[Sursă] "Înlocuire dinamică" pentru pluginurile .NET

[Copiază linkul]
Postat la 2021-8-15 21:55:14 | | |
Imaginează-ți un scenariu în care sistemul nostru de servicii oferă o serie de servicii funcționale, iar în viitor vor fi adăugate mai multe servicii funcționale noi, iar serviciile funcționale ar putea necesita modificări sau eliminări. O cerință de bază comună pentru un astfel de sistem de servicii este ca funcționarea sistemului de servicii să nu poată fi oprită atunci când se adaugă/elimină/actualizează servicii funcționale. În mod normal, "pluginurile hot-swapping" pot fi implementate foarte ușor prin încapsularea fiecărui serviciu într-un DLL de pluginuri, dar "hot replacement" ("înlocuire dinamică") a pluginurilor devine o problemă. Motivul este că atunci când dezinstalăm un plugin DLL din sistemul de servicii, acesta păstrează de fapt referința de bază la dll, iar dacă încerci să ștergi sau să suprascrii dll-ul, Windows va afișa un mesaj de genul "dll este folosit".

Deci, cum pot rezolva această problemă? Cred că există cel puțin două opțiuni:

(1) Folosiți AppDomain. Încărcarea pluginurilor într-un nou AppDomain și apoi dezinstalarea AppDomain descarcă curat DLL-urile pluginurilor din sistemul de servicii. Dezavantajul acestei abordări este că trebuie să gestionezi multe AppDomain-uri (pentru că ai atât de multe servicii funcționale), iar comunicarea între AppDomain-uri se face la distanță, ceea ce introduce multe bătăi de cap inutile în sistemul nostru. Dacă ești interesat, poți încerca și această opțiune, iar eu prefer să folosesc a doua.

(2) Copiază DLL-ul pluginului în memorie, apoi încarcă DLL-ul în memorie. Astfel, DLL-urile de pe hard disk pot fi suprascrise sau șterse după bunul plac. Anterior, am încărcat pluginul Dll direct de pe hard disk, așa:

Acum, trebuie să facem o schimbare:


Aceasta rezolvă problema "înlocuirii dinamice" a pluginurilor.





Precedent:Spring Cloud înregistrează toate jurnalele interfeței cererilor în MongoDB
Următor:.NET/C# convertește numele câmpurilor subliniate în forme de cocoașă mare
Postat la 2021-8-15 23:11:28 |
Un proiect atât de mare, e mai bine să repornești serverul noaptea...
Postat la 2021-8-17 14:43:41 |
Mulțumesc că ai împărtășit!~'
Postat la 2021-9-16 18:25:58 |
Răspunsuri la test
Postat la 2021-9-17 21:39:18 |
Învață-l
Postat la 2021-9-18 19:05:29 |
Această postare a fost editată ultima dată de fyxh66 pe 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 a încercat și el, fără @小slag Șeful are timp să ajute să arunce o privire
 Proprietarul| Postat la 2021-9-18 22:08:32 |
fyxh66 Postat pe 2021-9-18 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Nu am întâmpinat această problemă.

Există două situații în care apare excepția System.BadImageFormatException: platforma țintă a programului este inconsistentă, > platforma sistemului fișierului dll de referință este inconsistentă.

Verifică: Sunt versiunile .NET ale programului principal și ale DLL-urilor plug-in, iar platforma țintă fiind consistente, sau DLL-urile nu sunt dezvoltate pe .net?
Postat la 2021-9-19 16:17:56 |
Publicat la 2021-9-18, 22:08
Nu am întâmpinat această problemă.

Există două situații în care apare excepția System.BadImageFormat: platforma țintă a programului este inconsistentă > referința dll ...

Da, DLL-ul C++...
 Proprietarul| Postat la 2021-9-19 17:01:33 |

Cu siguranță nu e bine, pluginul dinamic de aici poate încărca doar DLL-uri .NET, iar DLL-urile care apelează C++ nu sunt ajustate în acest mod
Postat la 2021-9-19 18:54:53 |
Xiaozha Postat la 2021-9-19 17:01
Cu siguranță nu e bine, pluginul dinamic de aici poate încărca doar DLL-uri .net, iar DLL-urile care apelează C++ nu sunt reglate așa...

Există vreo modalitate de a chema dll în C++ folosind direct byteset-ul de octeți al dll pentru a chema metodele din interior?
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com