Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 59779|Antwort: 9

[Quelle] "Dynamischer Ersatz" für .NET-Plugins

[Link kopieren]
Veröffentlicht am 15.8.2021, 21:55:14 | | |
Stellen Sie sich ein Szenario vor, in dem unser Service-System eine Reihe funktionaler Dienste bereitstellt, weitere neue funktionale Dienste in Zukunft hinzugefügt werden und funktionale Dienste möglicherweise geändert oder entfernt werden müssen. Eine gängige Grundvoraussetzung für ein solches Servicesystem ist, dass der Betrieb des Servicesystems beim Hinzufügen, Entfernen oder Aktualisieren funktionaler Services nicht gestoppt werden darf. Normalerweise können "Hot-Swapping-Plugins" sehr einfach implementiert werden, indem jeder Dienst in eine Plugin-DLL gekapselt wird, aber "Hot Replacement" ("dynamischer Ersatz") von Plugins wird zum Problem. Der Grund ist, dass wenn wir eine Plugin-Dll aus dem Service-System deinstallieren, das Service-System tatsächlich noch die zugrundeliegende Referenz auf die DLL enthält, und wenn man versucht, die DLL zu löschen oder zu überschreiben, gibt Windows eine Meldung wie "Die DLL wird verwendet".

Wie löst man also dieses Problem? Ich denke, es gibt mindestens zwei Möglichkeiten:

(1) AppDomain verwenden. Das Laden von Plugins in einer neuen AppDomain und das anschließende Deinstallieren der AppDomain entlädt die Plugin-DLLs sauber aus dem Service-System. Der Nachteil dieses Ansatzes ist, dass man viele AppDomains verwalten muss (weil es so viele funktionale Dienste gibt), und die Kommunikation über AppDomains erfolgt auf ferngesteuerte Weise, was unserem System viele unnötige Kopfschmerzen bereitet. Wenn du interessiert bist, kannst du auch diese Option ausprobieren, und ich bevorzuge die zweite.

(2) Kopiere die Plugin-Dll im Speicher und lade dann die Dll im Speicher. Auf diese Weise können die DLLs auf der Festplatte nach Belieben überschrieben oder gelöscht werden. Früher haben wir Plugin Dll direkt von der Festplatte geladen, so:

Jetzt müssen wir eine Kurve wenden:


Dies löst das Problem des "dynamischen Austauschs" von Plugins.





Vorhergehend:Spring Cloud erfasst alle Anfrageschnittstellen-Logs in MongoDB
Nächster:.NET/C# wandelt unterstrebte Feldnamen in große Höckerformen um
Veröffentlicht am 15.8.2021, 23:11:28 |
So ein großes Projekt, es ist besser, den Server nachts neu zu starten...
Veröffentlicht am 17.8.2021, 14:43:41 |
Danke fürs Teilen!~'
Veröffentlicht am 16.9.2021, 18:25:58 |
Testantworten
Veröffentlicht am 17.9.2021, 21:39:18 |
Lerne es
Veröffentlicht am 18.9.2021, 19:05:29 |
Dieser Beitrag wurde zuletzt von fyxh66 am 18.9.2021 um 19:07 bearbeitet

System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。”IL 格式不正确。
  • var dll = Assembly.Load(addinStream);
86 hat es auch versucht, kein @小slag Der Chef hat Zeit, um zu helfen, nachzusehen
 Vermieter| Veröffentlicht am 18.09.2021, 22:08:32 |
fyxh66 veröffentlicht am 18.9.2021, 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Ich bin auf dieses Problem nicht gestoßen.

Es gibt zwei Situationen, in denen die System.BadImageFormatException-Ausnahme auftritt: Die Zielplattform des Programms ist inkonsistent > die Systemplattform der Referenz-DLL-Datei ist inkonsistent.

Check: Sind die .NET-Versionen des Hauptprogramms und der Plug-in-DLLs konsistent und die Zielplattform konsistent, oder sind die DLLs nicht auf .NET entwickelt?
Veröffentlicht am 19.09.2021, 16:17:56 |
Veröffentlicht am 18.9.2021, 22:08 Uhr
Ich bin auf dieses Problem nicht gestoßen.

Es gibt zwei Situationen, in denen die System.BadImageFormatException-Ausnahme auftritt: Die Programm-Zielplattform ist inkonsistent > der Referenz-DLL ...

Ja, die c++ dll...
 Vermieter| Veröffentlicht am 19.09.2021, 17:01:33 |

Das ist definitiv nicht gut, das dynamische Plugin hier kann nur .NET-DLLs laden, und die DLLs, die C++ aufrufen, werden nicht so angepasst
Veröffentlicht am 19.9.2021, 18:54:53 |
Xiaozha Veröffentlicht am 19.09.2021, 17:01
Das ist definitiv nicht gut, das dynamische Plugin hier kann nur .net-DLLs laden, und die DLLs, die C++ aufrufen, sind nicht so abgestimmt...

Gibt es eine Möglichkeit, die dll in C++ direkt mit dem Byte[]-Byteset der dll zu beauftragen, um die Methoden darin aufzurufen?
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com