NOTE - Si cette réponse ne vous aide pas, prenez le temps de parcourir les autres réponses ajoutées depuis.
Réponse courte
Cela peut se produire si vous ajoutez une méthode à une interface dans un assemblage, puis à une classe d'implémentation dans un autre assemblage, mais que vous reconstruisez l'assemblage d'implémentation sans faire référence à la nouvelle version de l'assemblage d'interface.
Dans ce cas, DummyItem implémente une interface provenant d'un autre assemblage. La méthode SetShort a été récemment ajoutée à la fois à l'interface et au DummyItem - mais l'assemblage contenant le DummyItem a été reconstruit en faisant référence à la version précédente de l'assemblage de l'interface. La méthode SetShort est donc bien présente, mais sans la sauce magique qui la relie à la méthode équivalente dans l'interface.
Réponse longue
Si vous voulez essayer de reproduire ce phénomène, essayez ce qui suit :
-
Créer un projet de bibliothèque de classes : InterfaceDef, ajoutez une seule classe et construisez :
public interface IInterface
{
string GetString(string key);
//short GetShort(string key);
}
-
Créez un deuxième projet de bibliothèque de classe : Implementation (avec une solution séparée), copier InterfaceDef.dll dans le répertoire du projet et l'ajouter comme référence de fichier, ajouter juste une classe, et construire :
public class ImplementingClass : IInterface
{
#region IInterface Members
public string GetString(string key)
{
return "hello world";
}
//public short GetShort(string key)
//{
// return 1;
//}
#endregion
}
-
Créez un troisième projet de console : ClientCode, copiez les deux dll dans le répertoire du projet, ajoutez des références de fichiers et ajoutez le code suivant dans la méthode Main :
IInterface test = new ImplementingClass();
string s = test.GetString("dummykey");
Console.WriteLine(s);
Console.ReadKey();
-
Exécutez le code une fois, la console dit "hello world"
-
Décommenter le code dans les deux projets de dll et reconstruire - recopier les deux dll dans le projet ClientCode, reconstruire et essayer de nouveau. TypeLoadException se produit lors de l'instanciation de la classe ImplementingClass.
17 votes
J'aime la façon dont vous avez partagé votre expérience avec la communauté pour nous aider tous, et vous nous avez même encouragés à lire les autres réponses, merci. Malheureusement, aucune des suggestions n'a fonctionné pour moi. Vous voulez savoir ce qui a fonctionné pour moi ? Redémarrer Visual Studio. Pourquoi n'ai-je pas essayé d'abord ?
0 votes
Merci Paul, après avoir lu ton commentaire, j'ai d'abord essayé celui-là. Cela a fonctionné comme un charme :-)
0 votes
Merci Paul, cela m'a permis de gagner quelques heures en me grattant la tête comme un singe...
0 votes
De plus, après la mise à jour de VS 2017 15.7, VS vous demande de redémarrer. Il se peut que vous ne l'ayez pas fait (comme moi, à cause de réunions que j'ai oubliées). J'ai eu des tas d'erreurs comme celles-ci...
0 votes
J'ai rencontré ce problème lors de l'exécution de tests unitaires dans MsTest. Les classes testées se trouvaient dans un assemblage signé. Une version différente de cet assemblage se trouvait dans le GAC. MsTest récupérait l'assemblage du GAC au lieu d'utiliser celui du dossier bin, et essayait d'exécuter les tests contre lui, ce qui ne fonctionnait évidemment pas. La solution consistait à supprimer l'assemblage GAC.
0 votes
@PaulMcLean un commentaire aussi ancien et qui a quand même fonctionné ;-) J'ai eu le problème après que Windows ait été en mode d'économie d'énergie. Aucun code n'a été modifié. C'était donc la première chose à essayer.