Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 59779|Svar: 9

[Kilde] "Dynamisk udskiftning" for .NET-plugins

[Kopier link]
Opslået den 15-8-2021 21:55:14 | | |
Forestil dig et scenarie, hvor vores servicesystem leverer en række funktionelle tjenester, og flere nye funktionelle tjenester vil blive tilføjet i fremtiden, og funktionelle tjenester kan være nødt til at ændres eller fjernes. Et almindeligt grundlæggende krav for et sådant servicesystem er, at driften af servicesystemet ikke kan stoppes, når funktionelle tjenester tilføjes/fjernes/opdateres. Normalt kan "hot-swapping plugins" implementeres meget nemt ved at indkapsle hver service i en plugin-dll, men "hot replacement" ("dynamisk udskiftning") af plugins bliver et problem. Årsagen er, at når vi afinstallerer en plugin-dll fra servicesystemet, holder servicesystemet faktisk stadig den underliggende reference til dll'en, og hvis du prøver at slette eller overskrive dll'en, vil Windows give en besked som "dll'en bliver brugt".

Så hvordan løser man dette problem? Jeg tror, der er mindst to muligheder:

(1) Brug AppDomain. Indlæsning af plugins i et nyt AppDomain og derefter afinstallation af AppDomain fjerner plugin-dll'erne rent fra servicesystemet. Ulempen ved denne tilgang er, at du skal administrere mange AppDomains (fordi du har så mange funktionelle tjenester), og kommunikationen på tværs af AppDomains foregår på en fjernforbindelsesmåde, hvilket medfører mange unødvendige hovedpiner i vores system. Hvis du er interesseret, kan du også prøve denne mulighed, og jeg foretrækker at bruge den anden.

(2) Kopier plugin-Dll'en i hukommelsen, og indlæs derefter Dll'en i hukommelsen. På denne måde kan DLL'erne på harddisken overskrives eller slettes efter behag. Tidligere indlæste vi plugin Dll direkte fra harddisken, sådan her:

Nu skal vi vende et hjørne:


Dette løser problemet med "dynamisk udskiftning" af plugins.





Tidligere:Spring Cloud registrerer alle anmodningsgrænsefladelogs til MongoDB
Næste:.NET/C# konverterer understregede feltnavne til store pukkelformer
Opslået den 15-8-2021 kl. 23:11:28 |
Så stort et projekt, det er bedre at genstarte serveren om natten...
Opslået den 17-8-2021 14:43:41 |
Tak fordi du delte!~'
Opslået den 16-9-2021 kl. 18:25:58 |
Testsvar
Opslået den 17-9-2021 21:39:18 |
Lær det
Opslået den 18. september 2021 kl. 19:05:29 |
Dette indlæg blev sidst redigeret af fyxh66 den 18-9-2021 kl. 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 prøvede også, ingen @小slag Chefen har tid til at hjælpe med at kigge
 Udlejer| Opslået den 2021-9-18 22:08:32 |
fyxh66 opslået den 2021-9-18 kl. 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Jeg har ikke oplevet dette problem.

Der er to situationer, hvor System.BadImageFormatException-undtagelsen opstår: programmets målplatform er inkonsistent, > systemplatformen for reference-dll-filen er inkonsistent.

Tjek: Er .NET-versionerne af hovedprogrammet og plug-in dll'erne konsistente, og målplatformen konsistente, eller er dll'erne ikke udviklet på .net?
Opslået den 2021-9-19 16:17:56 |
Udgivet den 18. september 2021 kl. 22:08
Jeg har ikke oplevet dette problem.

Der er to situationer, hvor System.BadImageFormatException-undtagelsen opstår: programmets målplatform er inkonsistent > reference-dll ...

Ja, c++ dll...
 Udlejer| Opslået den 19-9-2021 kl. 17:01:33 |

Det er bestemt ikke godt, det dynamiske plugin her kan kun indlæse .NET DLL'er, og DLL'erne, der kalder C++, justeres ikke på denne måde
Opslået den 2021-9-19 18:54:53 |
Xiaozha Opslået den 19-9-2021 kl. 17:01
Det er bestemt ikke godt, det dynamiske plugin her kan kun indlæse .net DLL'er, og DLL'erne, der kalder C++, er ikke tunet sådan her...

Er der nogen måde at kalde dll'en i C++ ved direkte at bruge byte[]-bytesættet fra dll'en til at kalde metoderne indeni?
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com