Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 59779|Svar: 9

[Källa] "Dynamisk ersättning" för .NET-plugins

[Kopiera länk]
Publicerad den 2021-8-15 21:55:14 | | |
Föreställ dig ett scenario där vårt tjänstesystem tillhandahåller en serie funktionella tjänster, och fler nya funktionella tjänster kommer att läggas till i framtiden, och funktionella tjänster kan behöva ändras eller tas bort. Ett vanligt grundläggande krav för ett sådant tjänstesystem är att driften av tjänstesystemet inte kan stoppas när funktionella tjänster läggs till/tas bort/uppdateras. Normalt kan "hot-swapping plugins" implementeras mycket enkelt genom att kapsla in varje tjänst i en plugin-dll, men "hot replacement" ("dynamisk ersättning") av plugins blir ett problem. Anledningen är att när vi avinstallerar en plugin-DLL från servicesystemet, så håller servicesystemet faktiskt fortfarande den underliggande referensen till DLL:n, och om du försöker ta bort eller skriva över DLL:n kommer Windows att ge ett meddelande som "DL:n används".

Så hur löser man det här problemet? Jag tror att det finns minst två alternativ:

(1) Använd AppDomain. Att ladda plugins i en ny AppDomain och sedan avinstallera AppDomain rensar plugin-dll:arna från tjänstesystemet. Nackdelen med detta tillvägagångssätt är att du måste hantera många AppDomains (eftersom du har så många funktionella tjänster), och kommunikationen mellan AppDomains sker på ett distanserat sätt, vilket medför många onödiga huvudvärk i vårt system. Om du är intresserad kan du också prova det här alternativet, och jag föredrar att använda det andra.

(2) Kopiera plugin-Dll i minnet och ladda sedan Dll i minnet. På så sätt kan DLL:erna på hårddisken skrivas över eller raderas när som helst. Tidigare laddade vi plugin Dll direkt från hårddisken, så här:

Nu måste vi vända ett hörn:


Detta löser problemet med "dynamisk ersättning" av plugins.





Föregående:Spring Cloud registrerar alla loggar för förfrågningsgränssnitt till MongoDB
Nästa:.NET/C# omvandlar markerade fältnamn till stora puckelformer
Publicerad den 2021-8-15 23:11:28 |
Så stort projekt, det är bättre att starta om servern på natten...
Publicerad den 2021-8-17 14:43:41 |
Tack för att du delade med dig!~'
Publicerad den 2021-9-16 18:25:58 |
Testsvar
Publicerad den 2021-9-17 21:39:18 |
Lär dig det
Publicerad den 2021-9-18 19:05:29 |
Detta inlägg redigerades senast av fyxh66 den 2021-9-18 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 försökte också, ingen @小slag Chefen har tid att hjälpa till att titta
 Hyresvärd| Publicerad den 2021-9-18 22:08:32 |
fyxh66 publicerad den 2021-9-18 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Har inte stött på det här problemet.

Det finns två situationer där undantaget System.BadImageFormatException uppstår: programmets målplattform är inkonsekvent > systemplattformen för referens-dll-filen är inkonsekvent.

Kolla: Är .NET-versionerna av huvudprogrammet och plug-in-dll:erna konsekventa, och målplattformen konsekventa, eller är dll:erna inte utvecklade på .net?
Publicerad den 2021-9-19 16:17:56 |
Publicerad den 2021-9-18 22:08
Har inte stött på det här problemet.

Det finns två situationer där undantaget System.BadImageFormatException uppstår: programmets målplattform är inkonsekvent > referens-dll ...

Ja, c++ dll...
 Hyresvärd| Publicerad den 2021-9-19 17:01:33 |

Det är definitivt inte bra, det dynamiska pluginet här kan bara ladda .NET DLL:er, och DLL:erna som anropar C++ justeras inte på detta sätt
Publicerad den 2021-9-19 18:54:53 |
Xiaozha Publicerad den 2021-9-19 17:01
Det är definitivt inte bra, det dynamiska pluginet här kan bara ladda .net-DLL:er, och DLL:erna som anropar C++ är inte inställda så här...

Finns det något sätt att anropa dll:n i C++ genom att direkt använda byte[]-bytesetet från dll:n för att anropa metoderna inuti?
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com