Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 59779|Risposta: 9

[Fonte] "Sostituzione dinamica" per plugin .NET

[Copiato link]
Pubblicato il 15-08-2021 21:55:14 | | |
Immaginate uno scenario in cui il nostro sistema di servizi fornisce una serie di servizi funzionali, e in futuro verranno aggiunti nuovi servizi funzionali, e i servizi funzionali potrebbero dover essere modificati o rimossi. Un requisito di base comune per un sistema di servizio di questo tipo è che il funzionamento del sistema di servizio non possa essere fermato quando si aggiungono/rimuovono/aggiornano servizi funzionali. Normalmente, i "hot-swapping" plugin possono essere implementati molto facilmente incapsulando ogni servizio in un plugin dll, ma la "hot replacement" ("sostituzione dinamica") dei plugin diventa un problema. Il motivo è che quando disinstalliamo un plugin Dll dal sistema di servizio, il sistema di servizio mantiene comunque il riferimento sottostante alla DLL, e se provi a cancellare o sovrascrivere la DLL, Windows ti dà un messaggio tipo "la dll è in uso".

Allora, come risolvere questo problema? Penso che ci siano almeno due opzioni:

(1) Usa AppDomain. Caricare plugin in un nuovo AppDomain e poi disinstallare l'AppDomain scarica pulitamente le DLL dei plugin dal sistema di servizio. Lo svantaggio di questo approccio è che devi gestire molti AppDomain (perché hai così tanti servizi funzionali), e la comunicazione tra AppDomain avviene in modo remoto, il che introduce molti problemi inutili al nostro sistema. Se sei interessato, puoi provare anche questa opzione, e io preferisco usare la seconda.

(2) Copia il plugin Dll in memoria, e poi carica il Dll in memoria. In questo modo, le DLL sull'hard disk possono essere sovrascritte o cancellate a piacimento. In precedenza abbiamo caricato il plugin Dll direttamente dall'hard disk, così:

Ora, dobbiamo girare un angolo:


Questo risolve il problema della "sostituzione dinamica" dei plugin.





Precedente:Spring Cloud registra tutti i log delle interfacce delle richieste su MongoDB
Prossimo:.NET/C# converte i nomi dei campi sottolineati in forme a grandi gobbe
Pubblicato il 15-08-2021 23:11:28 |
Un progetto così grande, è meglio riavviare il server di notte...
Pubblicato il 17-08-2021 14:43:41 |
Grazie per aver condiviso!~'
Pubblicato il 16-09-2021 18:25:58 |
Risposte al test
Pubblicato il 17-09-2021 21:39:18 |
Imparalo
Pubblicato il 18-09-2021 19:05:29 |
Questo post è stato modificato l'ultima volta da fyxh66 il 18-9-2021 alle 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);
Anche 86 ci ha provato, nessun @小slag Il capo ha tempo per aiutare a dare un'occhiata
 Padrone di casa| Pubblicato il 18-09-2021 22:08:32 |
FYXH66 Pubblicato il 18-09-2021 alle 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Non ho mai riscontrato questo problema.

Ci sono due situazioni in cui si verifica l'eccezione System.BadImageFormatException: la piattaforma di destinazione del programma è incoerente > la piattaforma di sistema del file dll di riferimento è incoerente.

Verifica: Le versioni .NET del programma principale e delle DLL dei plug-in sono coerenti, e la piattaforma di destinazione sono coerenti, oppure le DLL non sono sviluppate su .net?
Pubblicato il 19-09-2021 16:17:56 |
Pubblicato il 18-9-2021 alle 22:08
Non ho mai riscontrato questo problema.

Ci sono due situazioni in cui si verifica l'eccezione System.BadImageFormatException: la piattaforma di destinazione del programma è incoerente > il riferimento dll ...

Sì, il dll in C++...
 Padrone di casa| Pubblicato il 19-09-2021 17:01:33 |

Questo sicuramente non è una buona cosa, il plugin dinamico qui può caricare solo DLL .NET, e le DLL che chiamano C++ non sono regolate in questo modo
Pubblicato il 19-09-2021 18:54:53 |
Xiaozha Pubblicato il 2021-9-19 17:01
Questo sicuramente non è una buona cosa, il plugin dinamico qui può caricare solo DLL .net, e le DLL che chiamano C++ non sono regolate così...

C'è un modo per chiamare la dll in C++ usando direttamente il byte[] byteet della dll per chiamare i metodi all'interno?
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com