Exploration approfondie : exception TypeLoadException, la méthode est évidemment implémentée mais l'invite est manquante
Cible :
Identifiez la cause première de l'exception TypeLoadException
indiquant qu'une méthode est manquante alors qu'en fait elle existe.
Question :
La machine de test a généré l'erreur suivante :
<code>System.TypeLoadException: 类型 'DummyItem' 中的方法 'SetShort'(来自程序集 'ActiveViewers (...)')没有实现。</code>
Copier après la connexion
Raison :
L'erreur résulte du fait qu'une version obsolète de l'assembly d'interface est référencée lors du processus de construction de l'assembly d'implémentation.
Explication technique :
-
Implémentation basée sur l'interface : Dans cet exemple, la classe 'DummyItem' implémente une interface dans un autre assembly.
-
Différences de version : La méthode 'SetShort' a récemment été ajoutée aux classes d'interface et d'implémentation. Toutefois, lorsque l’assembly d’implémentation est reconstruit, la version la plus récente de l’assembly d’interface n’est pas référencée.
-
Lien manquant : Par conséquent, la méthode 'SetShort' existe dans la classe d'implémentation, mais l'implémentation correspondante est manquante dans l'assembly d'interface référencé. Par conséquent, une exception
TypeLoadException
est levée.
Solution :
-
Nettoyer et reconstruire : Supprimez tous les répertoires 'bin' et 'obj' et reconstruisez tous les assemblys. Cela garantit que la version correcte de la DLL est utilisée.
-
Référence correcte de l'interface : Assurez-vous que pendant le processus de reconstruction, l'assembly d'implémentation fait référence à la dernière version de l'assembly d'interface. Cela relie la méthode 'SetShort' dans la classe d'implémentation avec sa méthode équivalente dans l'interface.
Démo :
Pour reproduire le problème :
- Créez un assembly d'interface qui contient la méthode 'GetString'.
- Créez une bibliothèque de classes d'implémentation qui fait référence à l'assembly d'interface et contient la méthode 'GetString'.
- Créez une application client qui référence les deux assemblys et appelle la méthode 'GetString'.
- Exécutez l'application et vérifiez le comportement.
- Ajoutez une nouvelle méthode 'GetShort' dans les assemblys d'interface et d'implémentation.
- Reconstruisez l'assembly d'implémentation sans référencer l'assembly d'interface mis à jour.
- Mettez à jour l'application client avec la nouvelle DLL et reconstruisez.
- Exécutez l'application client et observez l'exception
TypeLoadException
pour 'GetShort'.
Conseils supplémentaires :
- Vérifiez le numéro de version de l'assemblage pour garantir des références correctes.
- Utilisez des outils de gestion des dépendances pour suivre les dépendances des assemblys.
- Utilisez le mécanisme de journalisation pour identifier les incohérences de version.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!