Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 59779|Odgovoriti: 9

[Vir] "Dinamična zamenjava" za .NET vtičnike

[Kopiraj povezavo]
Objavljeno 2021-8-15 21:55:14 | | |
Predstavljajte si scenarij, kjer naš sistem storitev zagotavlja vrsto funkcionalnih storitev, v prihodnosti pa bo dodanih več novih funkcionalnih storitev, funkcionalne storitve pa bo morda treba spremeniti ali odstraniti. Pogosta osnovna zahteva za tak servisni sistem je, da delovanja servisnega sistema ni mogoče ustaviti pri dodajanju/odstranjevanju/posodabljanju funkcionalnih storitev. Običajno je mogoče "vtičnike za vročo menjavo" zelo enostavno implementirati tako, da se vsaka storitev kapsulira v vtičnik dll, vendar postane problem "vroča zamenjava" ("dinamična zamenjava") vtičnikov. Razlog je, da ko odstranimo vtičnik Dll iz servisnega sistema, sistem dejansko še vedno hrani osnovno referenco na dll, in če poskušate izbrisati ali prepisati dll, Windows prikaže sporočilo, kot je "dll se uporablja".

Kako torej rešiti ta problem? Mislim, da obstajata vsaj dve možnosti:

(1) Uporabite AppDomain. Nalaganje vtičnikov v novi AppDomain in nato odstranitev AppDomain čisto odstrani dll-je vtičnika iz servisnega sistema. Slabost tega pristopa je, da morate upravljati veliko AppDomainov (ker imate toliko funkcionalnih storitev), komunikacija med AppDomaini pa poteka na daljavo, kar našemu sistemu povzroča veliko nepotrebnih težav. Če vas zanima, lahko poskusite tudi to možnost, jaz pa raje uporabljam drugo.

(2) Kopirajte vtičnik Dll v pomnilnik in nato naložite Dll v pomnilnik. Na ta način se DLL-ji na trdem disku lahko po želji prepišejo ali izbrišejo. Prej smo vtičnik Dll nalagali neposredno s trdega diska, takole:

Zdaj moramo obrniti novo smer:


To rešuje problem "dinamične zamenjave" vtičnikov.





Prejšnji:Spring Cloud beleži vse loge uporabniškega vmesnika za zahteve v MongoDB
Naslednji:.NET/C# pretvori podčrtana imena polj v velike grbine
Objavljeno 15. 8. 2021 ob 23:11:28 |
Tako velik projekt, bolje je strežnik znova zagnati ponoči...
Objavljeno 17. 8. 2021 ob 14:43:41 |
Hvala, ker si delil!~'
Objavljeno 16. 9. 2021 ob 18:25:58 |
Testni odgovori
Objavljeno 17. 9. 2021 21:39:18 |
Nauči se
Objavljeno 18. 9. 2021 ob 19:05:29 |
Ta objava je bila nazadnje urejena s strani fyxh66 dne 18. 9. 2021 ob 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 je tudi poskusil, brez @小slag Šef ima čas, da pomaga pogledati
 Najemodajalec| Objavljeno 2021-9-18 22:08:32 |
FYXH66 objavljeno 18. 9. 2021 ob 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

S tem problemom se še nisem srečal.

Obstajata dve situaciji, kjer se pojavi izjema System.BadImageFormatException: ciljna platforma programa je nedosledna > sistemska platforma referenčne dll datoteke nedosledna.

Preverjeno: Ali so .NET različice glavnega programa in vtičnikov dll-jev dosledne, ciljna platforma pa dosledna, ali dll-ji niso razviti na .net?
Objavljeno 19. 9. 2021 ob 16:17:56 |
Objavljeno 18. 9. 2021 ob 22:08
S tem problemom se še nisem srečal.

Obstajata dve situaciji, ko se pojavi izjema System.BadImageFormatException: ciljna platforma programa je nedosledna > referenčni dll ...

Da, c++ dll...
 Najemodajalec| Objavljeno 19. 9. 2021 ob 17:01:33 |

To zagotovo ni dobro, dinamični vtičnik tukaj lahko naloži le .NET DLL-je, DLL-ji pa niso nastavljeni na ta način
Objavljeno 19. 9. 2021 ob 18:54:53 |
Xiaozha Objavljeno 19. 9. 2021 ob 17:01
To zagotovo ni dobro, dinamični vtičnik tukaj lahko naloži samo .net DLL-je, DLL-ji, ki kličejo C++, pa niso tako nastavljeni...

Ali obstaja kakšen način, da v C++ pokličem dll tako, da neposredno uporabim bajt[] bajtnega nabora dll za klic metod znotraj njega?
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com