Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 59779|Répondre: 9

[Source] « Remplacement dynamique » pour les plugins .NET

[Copié le lien]
Publié le 15-08-2021 à 21:55:14 | | |
Imaginez un scénario où notre système de services fournit une série de services fonctionnels, et où de nouveaux services fonctionnels seront ajoutés à l’avenir, et où les services fonctionnels pourraient devoir être modifiés ou supprimés. Une exigence de base courante pour un tel système de service est que le fonctionnement du système de service ne puisse pas être arrêté lors de l’ajout/suppression/mise à jour de services fonctionnels. Normalement, les « plugins à échange à chaud » peuvent être très facilement implémentés en encapsulant chaque service dans un DLL de plugins, mais le « remplacement à chaud » (« remplacement dynamique ») des plugins devient un problème. La raison est que lorsque nous désinstallons un plugin DLL du système de service, celui-ci conserve en fait la référence sous-jacente à la DLL, et si vous essayez de supprimer ou d’écraser la DLL, Windows affichera un message du type « la DLL est utilisée ».

Alors, comment résoudre ce problème ? Je pense qu’il y a au moins deux options :

(1) Utiliser AppDomain. Charger des plugins dans un nouveau AppDomain puis désinstaller l’AppDomain décharge proprement les DLL des plugins du système de service. L’inconvénient de cette approche est qu’il faut gérer de nombreux AppDomaines (car vous disposez de nombreux services fonctionnels), et la communication entre AppDomaines se fait à distance, ce qui introduit beaucoup de maux de route inutiles à notre système. Si ça t’intéresse, tu peux aussi essayer cette option, et je préfère utiliser la seconde.

(2) Copiez le DLL du plugin en mémoire, puis chargez le DLL en mémoire. Ainsi, les DLL du disque dur peuvent être écrasées ou supprimées à volonté. Auparavant, nous chargeions le plugin Dll directement depuis le disque dur, comme ceci :

Maintenant, il faut tourner un cap :


Cela résout le problème du « remplacement dynamique » des plugins.





Précédent:Spring Cloud enregistre tous les journaux de l’interface de requête sur MongoDB
Prochain:.NET/C# convertit les noms de champs soulignés en grandes formes de bosse
Publié le 15-08-2021 à 23:11:28 |
Un projet tellement important, il vaut mieux redémarrer le serveur la nuit...
Publié le 17-08-2021 à 14:43:41 |
Merci d’avoir partagé !~'
Publié le 16-09-2021 à 18:25:58 |
Réponses aux tests
Publié le 17-09-2021 à 21:39:18 |
Apprends-le
Publié le 18-09-2021 à 19:05:29 |
Ce post a été modifié pour la dernière fois par fyxh66 le 18/09/2021 à 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 a aussi essayé, sans @小slag Le patron a le temps d’aider à jeter un œil
 Propriétaire| Publié le 18-09-2021 à 22:08:32 |
fyxh66 publié le 18-09-2021 à 19:05
System.BadImageFormatException:“未能加载文件或程序集“12505088 bytes loaded from 3.3hook, Version=1 ...

Je n’ai pas rencontré ce problème.

Il existe deux situations où l’exception System.BadImageFormatException se produit : la plateforme cible du programme est incohérente > la plateforme système du fichier dll de référence l’est.

Vérifier : Les versions .NET du programme principal et des DLL des plug-ins sont-elles cohérentes, et la plateforme cible cohérente, ou bien les DLL ne sont-elles pas développées sur .NET ?
Publié le 19-09-2021 à 16:17:56 |
Publié le 18-09-2021 à 22:08
Je n’ai pas rencontré ce problème.

Il existe deux situations où l’exception System.BadImageFormat survient : la plateforme cible du programme est incohérente > la référence dll ...

Oui, le DLL c++...
 Propriétaire| Publié le 19-09-2021 à 17:01:33 |

Ce n’est clairement pas bon, le plugin dynamique ici ne peut charger que des DLL .NET, et les DLL appelant C++ ne sont pas ajustées de cette manière
Publié le 19-09-2021 à 18:54:53 |
Xiaozha Publié le 2021-9-19 17:01
Ce n’est clairement pas bon, le plugin dynamique ici ne peut charger que des DLL .net, et les DLL appelant C++ ne sont pas réglés comme ça...

Existe-t-il un moyen d’appeler la dll en C++ en utilisant directement le byte[] byteset de la dll pour appeler les méthodes à l’intérieur ?
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com