Maison > développement back-end > C++ > Pourquoi mon code lève-t-il une TypeLoadException même si la méthode est implémentée ?

Pourquoi mon code lève-t-il une TypeLoadException même si la méthode est implémentée ?

Linda Hamilton
Libérer: 2025-01-09 10:56:42
original
183 Les gens l'ont consulté

Why Does My Code Throw a TypeLoadException Even Though the Method Is Implemented?

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 :

  1. Implémentation basée sur l'interface : Dans cet exemple, la classe 'DummyItem' implémente une interface dans un autre assembly.
  2. 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.
  3. 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 :

  1. 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.
  2. 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 :

  1. Créez un assembly d'interface qui contient la méthode 'GetString'.
  2. 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'.
  3. Créez une application client qui référence les deux assemblys et appelle la méthode 'GetString'.
  4. Exécutez l'application et vérifiez le comportement.
  5. Ajoutez une nouvelle méthode 'GetShort' dans les assemblys d'interface et d'implémentation.
  6. Reconstruisez l'assembly d'implémentation sans référencer l'assembly d'interface mis à jour.
  7. Mettez à jour l'application client avec la nouvelle DLL et reconstruisez.
  8. 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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal