Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 59779|Válasz: 9

[Forrás] "Dinamikus helyettesítés" .NET pluginekhez

[Linket másol]
Közzétéve: 2021-8-15 21:55:14 | | |
Képzeljük el egy olyan helyzetet, amikor a szolgáltatási rendszerünk egy sor funkcionális szolgáltatást kínál, és a jövőben további új funkcionális szolgáltatásokat adnak hozzá, és előfordulhat, hogy a funkcionális szolgáltatásokat módosítani vagy eltávolítani kell. Egy ilyen szolgáltatási rendszer alapvető követelménye, hogy a szolgáltatási rendszer működését nem lehet megállítani funkcionális szolgáltatások hozzáadásakor, eltávolítása vagy frissítése során. Általában a "hot-swapping pluginok" nagyon könnyen megvalósíthatók, ha minden szolgáltatást egy plugin dll-be kapszulálnak, de a "hot replacement" ("dinamikus helyettesítés") problémát jelent. Ennek oka, hogy amikor eltávolítunk egy bővítmény DLL-t a szolgáltatási rendszerből, a szolgáltatási rendszer valójában még mindig megőrzi a DLL-re vonatkozó alaphivatkozást, és ha megpróbálod törölni vagy felülírni a dll-t, a Windows olyan üzenetet ad, mint például: "a dll használatban van".

Hogyan lehet ezt a problémát megoldani? Szerintem legalább két lehetőség van:

(1) Használd az AppDomain-t. Ha új AppDomainbe töltünk plugineket, majd eltávolítjuk az AppDomaint, akkor tisztán eltávolítjuk a plugin dll-eket a szolgáltatási rendszerről. Ennek a megközelítésnek az a hátránya, hogy sok AppDomain-et kell kezelni (mert rengeteg funkcionális szolgáltatásod van), és az AppDomainek közötti kommunikáció távoli módon zajlik, ami sok felesleges fejfájást okoz a rendszerünknek. Ha érdekel, ezt az opciót is kipróbálhatod, én inkább a másodikat választom.

(2) Másold le a plugin Dll-t a memóriába, majd töltsd be a Dll-t a memóriába. Így a merevlemezen lévő DLL-ek tetszés szerint felülírhatók vagy törölhetők. Korábban közvetlenül a merevlemezről töltöttük be a plugin DLL-t, így:

Most fordulnunk kell egy sarkon:


Ez megoldja a pluginek "dinamikus cseréje" problémáját.





Előző:A Spring Cloud rögzíti az összes kérési interfész naplót a MongoDB-be
Következő:A .NET/C# aláhúzott mezőneveket nagy pórosalakká alakítja
Közzétéve: 2021-8-15 23:11:28 |
Ilyen nagy projekt, jobb éjszaka újraindítani a szervert...
Közzétéve: 2021-8-17 14:43:41 |
Köszi, hogy megosztottad!~'
Közzétéve: 2021-9-16 18:25:58 |
Tesztválaszok
Közzétéve: 2021-9-17 21:39:18 |
Tanuld meg
Közzétéve: 2021-9-18 19:05:29 |
Ezt a bejegyzést utoljára fyxh66 szerkesztette 2021-09-18-án 19:07-én

System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。”IL 格式不正确。
  • var dll = Assembly.Load(addinStream);
86 is próbálkozott, nem @小slag A főnöknek van ideje segíteni megnézni
 Háziúr| Közzétéve: 2021-9-18 22:08:32 |
fyxh66 közzétéve: 2021-09-18 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Még nem találkoztam ezzel a problémával.

Két helyzet van, amikor a System.BadImageFormatException kivétel előfordul: a program célplatformja következetlen, > a referencia dll fájl rendszerplatformja következetlen.

Ellenőrzés: A fő program és a plug-in dll-ek .NET verziói következetesek, a célplatform pedig konzisztensek, vagy a dll-ek nem a .net-en vannak fejlesztve?
Közzétéve: 2021-09-19 16:17:56 |
Megjelent: 2021-09-18 22:08
Még nem találkoztam ezzel a problémával.

Két helyzet van, amikor a System.BadImageFormatException kivétel előfordul: a program célplatformja következetlen > a hivatkozás dll ...

Igen, a c++ dll...
 Háziúr| Közzétéve: 2021-09-19 17:01:33 |

Ez biztosan nem jó, a dinamikus plugin itt csak .NET DLL-eket tud betölteni, és a C++ hívású DLL-ek nem így vannak beállítva
Közzétéve: 2021-9-19 18:54:53 |
Xiaozha 2021-09-19-én írva, 17:01
Ez biztosan nem jó, a dinamikus plugin itt csak .net DLL-eket tud betölteni, és a C++ hívású DLL-ek nem így vannak hangolva...

Van mód arra, hogy a dll-t C++ nyelven hívjuk meg, közvetlenül a dll bájt[] bájtkészletét használva hívjuk meg a metódusokat?
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com