Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 59779|Antwoord: 9

[Bron] "Dynamische vervanging" voor .NET-plugins

[Link kopiëren]
Geplaatst op 2021-8-15 21:55:14 | | |
Stel je een scenario voor waarin ons servicesysteem een reeks functionele diensten levert, en er in de toekomst meer nieuwe functionele diensten worden toegevoegd, en functionele services mogelijk aangepast of verwijderd moeten worden. Een veelvoorkomende basisvereiste voor zo'n servicesysteem is dat de werking van het servicesysteem niet kan worden gestopt bij het toevoegen/verwijderen/updaten van functionele services. Normaal gesproken kunnen "hot-swapping plugins" heel eenvoudig worden geïmplementeerd door elke service in een plugin-dll te encapsuleren, maar "hot replacement" ("dynamische vervanging") van plugins wordt een probleem. De reden is dat wanneer we een plugin-Dll uit het servicesysteem verwijderen, het servicesysteem eigenlijk nog steeds de onderliggende verwijzing naar de dll bevat, en als je probeert de dll te verwijderen of te overschrijven, geeft Windows een bericht als "de dll wordt gebruikt".

Dus hoe los je dit probleem op? Ik denk dat er minstens twee opties zijn:

(1) Gebruik AppDomain. Plugins laden in een nieuw AppDomain en vervolgens het AppDomain verwijderen, laadt de plugin-dll's schoon uit het servicesysteem. Het nadeel van deze aanpak is dat je veel AppDomains moet beheren (omdat je zoveel functionele diensten hebt), en communicatie tussen AppDomains verloopt op een afstandsmanier, wat veel onnodige hoofdpijn in ons systeem veroorzaakt. Als je geïnteresseerd bent, kun je deze optie ook proberen, en ik geef de voorkeur aan de tweede.

(2) Kopieer de plugin Dll in het geheugen en laad vervolgens de Dll in het geheugen. Op deze manier kunnen de DLL's op de harde schijf naar wens worden overschreven of verwijderd. Eerder laadden we plugin Dll direct vanaf de harde schijf, zo:

Nu moeten we een bocht omslaan:


Dit lost het probleem van "dynamische vervanging" van plugins op.





Vorig:Spring Cloud registreert alle aanvraag-interfacelogs naar MongoDB
Volgend:.NET/C# zet onderstreepte veldnamen om in grote bultvormen
Geplaatst op 2021-8-15 23:11:28 |
Zo'n groot project, het is beter om de server 's nachts opnieuw op te starten...
Geplaatst op 2021-8-17 14:43:41 |
Bedankt voor het delen!~'
Geplaatst op 16-9-2021 18:25:58 |
Testantwoorden
Geplaatst op 2021-9-17 21:39:18 |
Leer het
Geplaatst op 18-9-2021 19:05:29 |
Dit bericht is voor het laatst bewerkt door fyxh66 op 18-9-2021 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 probeerde ook, geen @小slag De baas heeft tijd om te helpen kijken
 Huisbaas| Geplaatst op 18-9-2021 22:08:32 |
fyxh66 geplaatst op 18-9-2021 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Ik ben dit probleem niet tegengekomen.

Er zijn twee situaties waarin de System.BadImageFormatException-uitzondering optreedt: het doelplatform van het programma is inconsistent > het systeemplatform van het referentie-dll-bestand is inconsistent.

Check: Zijn de .NET-versies van het hoofdprogramma en plug-in dll's consistent, en het doelplatform consistent, of zijn de dll's niet ontwikkeld op .net?
Geplaatst op 2021-9-19 16:17:56 |
Gepubliceerd op 18-9-2021 22:08
Ik ben dit probleem niet tegengekomen.

Er zijn twee situaties waarin de System.BadImageFormatException-uitzondering optreedt: het doelplatform van het programma is inconsistent > de referentie-dll ...

Ja, de c++ dll...
 Huisbaas| Geplaatst op 2021-9-19 17:01:33 |

Dat is zeker niet goed, de dynamische plugin hier kan alleen .NET DLL's laden, en de DLL's die C++ aanroepen worden op deze manier niet aangepast
Geplaatst op 19-9-2021 18:54:53 |
Xiaozha Geplaatst op 19-9-2021 17:01
Dat is zeker niet goed, de dynamische plugin hier kan alleen .net-DLL's laden, en de DLL's die C++ aanroepen zijn niet zo afgestemd...

Is er een manier om de dll in C++ aan te roepen door direct de byte[] byteset van de dll te gebruiken om de methoden binnenin aan te roepen?
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com