Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 59779|Vastaus: 9

[Lähde] "Dynaaminen korvaus" .NET-lisäosille

[Kopioi linkki]
Julkaistu 2021-8-15 21:55:14 | | |
Kuvittele tilanne, jossa palvelujärjestelmämme tarjoaa sarjan toiminnallisia palveluita, ja tulevaisuudessa lisätään uusia toiminnallisia palveluita, ja toiminnallisia palveluita saattaa joutua muuttamaan tai poistamaan. Yleinen perusvaatimus tällaiselle palvelujärjestelmälle on, että palvelujärjestelmän toimintaa ei voida pysäyttää, kun toiminnallisia palveluita lisätään, poistetaan tai päivitetään. Normaalisti "hot-swap-pluginit" voidaan toteuttaa hyvin helposti kapseloimalla jokainen palvelu plugin dll:ään, mutta "hot replacement" ("dynaaminen korvaus") plugineissa muodostuu ongelmaksi. Syynä on se, että kun poistamme lisäosan DLL:n palvelujärjestelmästä, palvelujärjestelmä säilyttää edelleen taustaviitteen dll:ään, ja jos yrität poistaa tai korvata dll:n, Windows antaa viestin kuten "dll:ää on käytössä".

Miten tämä ongelma sitten ratkaistaan? Luulen, että vaihtoehtoja on ainakin kaksi:

(1) Käytä AppDomainia. Lisäosien lataaminen uuteen AppDomainiin ja sitten AppDomainin poistaminen poistaa pluginit palvelujärjestelmästä. Tämän lähestymistavan haittapuolena on, että sinun täytyy hallita monia AppDomaineja (koska sinulla on niin paljon toiminnallisia palveluita), ja AppDomainien välinen viestintä tapahtuu etänä, mikä aiheuttaa järjestelmällemme paljon tarpeettomia päänsärkyjä. Jos olet kiinnostunut, voit kokeilla tätä vaihtoehtoa, ja itse suosin toista.

(2) Kopioi plugin Dll muistiin ja lataa sitten Dll muistiin. Näin kovalevyn DLL:t voidaan korvata tai poistaa halutessaan. Aiemmin latasimme plugin DLL:n suoraan kovalevyltä, näin:

Nyt meidän täytyy kääntää kulma:


Tämä ratkaisee lisäosien "dynaamisen korvaamisen" ongelman.





Edellinen:Spring Cloud tallentaa kaikki pyyntörajapinnan lokit MongoDB:hen
Seuraava:.NET/C# muuntaa alleviivatut kentän nimet suuriksi kyhmymuodoiksi
Julkaistu 2021-8-15 23:11:28 |
Niin iso projekti, että on parempi käynnistää palvelin uudelleen yöllä...
Julkaistu 2021-8-17 klo 14:43:41 |
Kiitos, että jaoit!~'
Julkaistu 2021-9-16 klo 18:25:58 |
Testivastaukset
Julkaistu 2021-9-17 21:39:18 |
Opettele se
Julkaistu 2021-9-18 klo 19:05:29 |
Tätä julkaisua on viimeksi muokattu fyxh66:n toimesta 18.9.2021 klo 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 yritti myös, ei @小slag Pomolla on aikaa auttaa katsomaan
 Vuokraisäntä| Julkaistu 2021-9-18 22:08:32 |
fyxh66 julkaistu 18.9.2021 klo 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

En ole törmännyt tähän ongelmaan.

System.BadImageFormatException-poikkeus esiintyy kahdessa tilanteessa: ohjelman kohdealusta on epäjohdonmukainen > viite-dll-tiedoston järjestelmäalusta on epäjohdonmukainen.

Tarkistus: Ovatko pääohjelman .NET-versiot ja plug-in-dll-tiedostot johdonmukaisia ja kohdealusta johdonmukaisia, vai ovatko dll:t kehittymättömiä .netillä?
Julkaistu 2021-9-19 16:17:56 |
Julkaistu 18.9.2021 klo 22:08
En ole törmännyt tähän ongelmaan.

System.BadImageFormatException-poikkeus esiintyy kahdessa tilanteessa: ohjelman kohdealusta on epäjohdonmukainen > viite dll ...

Kyllä, c++ dll...
 Vuokraisäntä| Julkaistu 2021-9-19 klo 17:01:33 |

Se ei todellakaan ole hyvä, dynaaminen lisäosa voi ladata vain .NET DLL:iä, ja C++:n kutsuvat DLL:t eivät ole säädetty tällä tavalla
Julkaistu 2021-9-19 18:54:53 |
Xiaozha Julkaistu 19.9.2021 klo 17:01
Se ei todellakaan ole hyvä, dynaaminen plugin voi ladata vain .net DLL:t, ja DLL:t, jotka kutsuvat C++:ta, eivät ole viritetty näin...

Onko mitään tapaa kutsua dll:ää C++:ssa käyttämällä suoraan dll:n tavua, jotta metodit kutsuttiin sisällä?
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com