TypeLoadException dit "pas de mise en œuvre", mais il est mis en œuvre
J'ai eu un bug bizarre sur notre machine de test. L'erreur est:
System.TypeLoadException: Method 'SetShort' in type 'DummyItem' from assembly 'ActiveViewers (...)' does not have an implementation.
Je ne comprends juste pas pourquoi. SetShort
est là, dans la DummyItem
classe, et j'ai même une version recompilée avec écrit dans le journal des événements juste pour s'assurer que ce n'est pas un déploiement/versioning question. La chose étrange est que le code appelant n'a même pas appeler la SetShort
méthode.
J'aime la façon dont vous partagez votre expérience avec la communauté pour nous aider tous, et même encouragé à lire les autres réponses trop, je vous remercie. Malheureusement, aucun des suggestions a fonctionné pour moi. Voulez savoir ce qui n'a finalement de travailler avec moi? Redémarrer Visual Studio. Pourquoi n'ai-je pas essayer en premier?
Merci Paul, après avoir lu votre commentaire, j'ai essayé que la première. A fonctionné comme un charme 🙂
merci Paul, sauve-moi quelques heures en continu de me gratter la tête comme un singe...
Aussi, après VS 2017 15.7 mise à jour, VS vous dit de redémarrer. Vous ne pouvez pas avoir fait cela (comme moi, à cause d'une réunion que j'ai oublié). J'ai eu craploads des erreurs comme ces...
Juste pour ajouter mon 2p - j'ai eu ce problème lors de l'exécution des tests unitaires en MsTest. Les classes de test ont été dans un signé de l'assemblée. Une version différente de cette assemblée qui est arrivé à être dans le GAC. MsTest a été ramasser le GAC avais assemblée plutôt que d'utiliser l'une à partir de la corbeille, et en essayant de lancer les tests contre elle, ce qui n'était évidemment pas de travail. La Solution a été de supprimer le GAC avais assemblée
Merci Paul, après avoir lu votre commentaire, j'ai essayé que la première. A fonctionné comme un charme 🙂
merci Paul, sauve-moi quelques heures en continu de me gratter la tête comme un singe...
Aussi, après VS 2017 15.7 mise à jour, VS vous dit de redémarrer. Vous ne pouvez pas avoir fait cela (comme moi, à cause d'une réunion que j'ai oublié). J'ai eu craploads des erreurs comme ces...
Juste pour ajouter mon 2p - j'ai eu ce problème lors de l'exécution des tests unitaires en MsTest. Les classes de test ont été dans un signé de l'assemblée. Une version différente de cette assemblée qui est arrivé à être dans le GAC. MsTest a été ramasser le GAC avais assemblée plutôt que d'utiliser l'une à partir de la corbeille, et en essayant de lancer les tests contre elle, ce qui n'était évidemment pas de travail. La Solution a été de supprimer le GAC avais assemblée
OriginalL'auteur Benjol | 2009-06-04
Vous devez vous connecter pour publier un commentaire.
NOTE - Si cette réponse ne vous aide pas, veuillez prendre le temps de faire défiler vers le bas par l'intermédiaire d'autres réponses que les gens ont ajouté depuis.
Réponse courte
Cela peut se produire si vous ajoutez une méthode d'une interface dans une assemblée, puis à la mise en œuvre de la classe dans une autre assemblée, mais vous reconstruire la mise en œuvre de l'assemblée sans faire référence à la nouvelle version de l'interface de l'assemblée.
Dans ce cas, DummyItem implémente une interface à partir d'une autre assemblée. Le SetShort méthode a récemment été ajoutée à la fois l'interface et la DummyItem - mais l'assemblée contenant DummyItem a été reconstruite référencement de la précédente version de l'interface de l'assemblée. Ainsi, le SetShort méthode est effectivement là, mais sans la magie de la sauce en le reliant à l'équivalent de la méthode dans l'interface.
Réponse longue
Si vous voulez essayer de reproduire cela, essayez ce qui suit:
Créer un projet de bibliothèque de classes: InterfaceDef, ajouter une seule classe, et de construire:
Créer un deuxième projet de bibliothèque de classe: mise en Œuvre (avec solution distincte), copie InterfaceDef.dll dans le répertoire du projet et ajouter un fichier de référence, ajouter une seule classe, et de construire:
D'en créer une troisième, projet de console: ClientCode, copiez les deux dll dans le répertoire du projet, ajouter des références de fichier, et ajouter le code suivant dans la méthode main:
Exécuter le code une fois, la console dit "hello world"
Dé-commenter le code dans les deux projets dll et à reconstruire - copier les deux dll de retour dans le ClientCode projet, de reconstruire et d'essayer de l'exécuter à nouveau. TypeLoadException se produit lorsque vous tentez d'instancier la ImplementingClass.
bon point pour moi "en cours d'exécution à nouveau" implicite F5. J'ai mis à jour la réponse. Bien sûr, tout cela ne serait pas arrivé avec un bon contrôle de la source de l'outil, mais ne me lancez pas sur le sujet...
Hmm, ça ressemble à de Microsoft, message d'erreur est une erreur - c'est dire qu'une méthode de la classe "DummyItem" ne dispose pas d'une mise en œuvre, ce qui est manifestement faux.... vraiment le problème est que la méthode de l'interface n'est pas mis en œuvre PAR DummyItem.
toute bonne solution définitive à ce sujet ? Quelle solution a été recommandées par Microsoft ?
La solution est de supprimer les fichiers bin manuellement. La publication n'est pas à considérer comme changé de sorte que vous besoin de forcer pour avoir le dernier. Cela devrait vraiment être noté dans le top rated réponse!
OriginalL'auteur Benjol
En outre à ce que le demandeur a sa propre réponse déjà déclaré, il peut être intéressant de noter les suivantes. La raison à cela est qu'il est possible pour une classe d'une méthode avec la même signature qu'une méthode de l'interface sans la mise en œuvre de cette méthode. Le code suivant illustre le fait que:
OriginalL'auteur Timwi
J'ai eu ce que ma candidature n'avait pas une référence à une autre assemblée de la définition d'une classe de la méthode dans le message d'erreur utilisé. L'exécution de PEVerify a donné plus utile d'erreur: "Le système ne peut pas trouver le fichier spécifié."
OriginalL'auteur silent tone
Je suis tombé sur le même message et voici ce que nous avons trouvé:
Nous utilisons des tiers dll dans notre projet. Après une nouvelle version de celles-ci, nous avons changé notre projet pour pointer vers le nouvel ensemble de dll et compilé avec succès.
L'exception a été levée quand j'ai essayé de démarrent des instances d'un des leurs interfacé classes au cours de l'exécution.
Nous avons fait en sorte que toutes les autres références ont été jusqu'à ce jour, mais toujours pas de chance.
Nous avons besoin d'un certain temps pour spot (à l'aide de l'explorateur d'Objets) que le type de retour de la méthode dans le message d'erreur était d'un type entièrement nouveau à partir d'une nouvelle, non référencé à l'assemblée.
Nous avons ajouté une référence à l'assembly et l'erreur a disparu.
OriginalL'auteur Ben
J'ai reçu cette erreur dans le scénario suivant.
var target = Assembly.GetAssembly(typeof(FertPin.Classes.Contact));
Le correctif pour moi a été la mise à niveau du Système.Web.Mvc de référence dans l'Assemblage de B à 4.0.0.0. Semble évident aujourd'hui!
Grâce à l'affiche originale!
J'ai eu un problème similaire causée par le chargement des types qui ciblée .NET2 dans un ReflectionOnly contexte d'une .NET4 application. J'ai contourné le problème en redirigeant toutes les opérations d'assemblage des demandes de .NET2 les assemblages de leur .NET4 homologues dans le domaine d'application.ReflectionOnlyAssemblyResolve événement.
C'était ma question 🙂 Merci!
OriginalL'auteur Damien Sawyer
L'autre fois, vous pouvez obtenir cette erreur si vous avez une version incorrecte de la signature de l'assemblée. Ce n'est pas le symptôme normal pour cette cause, mais ici, c'était le scénario où je l'ai
un asp.net projet contient l'assemblage et de montage B, B est fortement nommé
assemblée utilise Un Activateur.CreateInstance à la charge de l'assemblée C (c'est à dire il n'y a pas de référence à C qui est construit séparément)
C a été construit, faisant référence à une ancienne version de montage B qu'à l'heure actuelle
espère que ça aide quelqu'un, il m'a fallu les âges.
OriginalL'auteur Tim
J'ai eu cette erreur de trop, elle a été causée par un CPU exe référence CPU assemblées qui à son tour a référencé un x86 assemblée.
L'exception plaint d'une méthode d'une classe dans MyApp.Les implémentations (CPU), qui proviennent MyApp.Interfaces (CPU), mais dans fuslogvw.exe j'ai trouvé un caché "tentative de chargement d'un programme avec un format incorrect' exception de MyApp.CommonTypes (x86) qui est utilisé par les deux.
OriginalL'auteur Richard Dingwall
J'ai rencontré cette erreur dans un contexte où j'ai été en utilisant Autofac et beaucoup de dynamique de l'assemblage de chargement.
Lors de l'exécution d'un Autofac résolution de fonctionnement, le moteur d'exécution de ne pas charger l'un des assemblées. Le message d'erreur s'est plaint que
Method 'MyMethod' in type 'MyType' from assembly 'ImplementationAssembly' does not have an implementation
. Les symptômes s'est produite lors de l'exécution sur un Serveur Windows 2012 R2 VM, mais n'a pas se produire sur Windows 10 ou Windows Server 2016 VMs.ImplementationAssembly
référencéSystem.Collections.Immutable
1.1.37, et les implémentations deIMyInterface<T1,T2>
de l'interface, qui a été définie dans un autreDefinitionAssembly
.DefinitionAssembly
référencéSystem.Collections.Immutable
1.1.36.Les méthodes de
IMyInterface<T1,T2>
qui n'ont pas été "mis en œuvre" avait des paramètres de typeIImmutableDictionary<TKey, TRow>
, qui est définie dansSystem.Collections.Immutable
.La copie réelle de
System.Collections.Immutable
trouve dans le répertoire du programme était la version 1.1.37. Sur mon Serveur Windows 2012 R2 VM, le GAC contenait une copie deSystem.Collections.Immutable
1.1.36. Sur Windows 10 et Windows Server 2016, le GAC contenait une copie deSystem.Collections.Immutable
1.1.37. Le chargement d'erreur ne s'est produite lorsque le GAC contenues dans l'ancienne version de la DLL.Donc, à l'origine de l'assemblage de la rupture de charge est la disjonction des références à
System.Collections.Immutable
. La définition de l'interface et la mise en œuvre avait identiques d'aspect des signatures de méthode, mais en fait dépendait différentes versions deSystem.Collections.Immutable
, ce qui signifie que l'exécution n'a pas d'envisager la mise en œuvre de la classe pour correspondre à la définition de l'interface.Adjonction de liaison rediriger vers mon fichier de config fixe la question:
Hmm. C'était il y a longtemps. Je pense que le principal indice était le "point mort" de la méthode paramètres types de
System.Collections.Immutable
. Dans mon cas, il n'y avait pas beaucoup d'autres candidats de paramètre ou les types de retour dans la méthode. Je me souviens aussi de l'aide de ILSpy pour inspecter les métadonnées de dépendance dans la compilation "DefinitionAssembly" et "ImplementationAssembly" Dll, portant spécifiquement sur les versions de la des références.Merci beaucoup! 😉 J'ai installé le ILSpy extension pour Visual Studio et regarda les Références de la branche, il y en avait un pour le
System.Net.Http
paquet, j'ai ajouté ledependentAssembly
élément et copié l'info de ILSpy et ça fonctionne maintenant, l'erreur a disparu!J'ai compris qui était le mauvais GAC assemblée en mettant ceci dans le code et de mettre un point d'arrêt juste après elle à regarder les valeurs et de voir les deux versions de Système.Net.Http ont été chargés: var loadedAssemblies = de a, dans le domaine d'application.CurrentDomain.GetAssemblies() orderby un.FullName sélectionnez (un.FullName, a);
OriginalL'auteur Hydrargyrum
Je l'ai obtenu avec un "diamant" en forme de dépendance de projet:
J'ai recompilé Un projet mais pas le Projet B, ce qui a permis au Projet B à "injecter" de l'ancienne version du Projet D dll
Je pense que j'avais une version similaire de ce problème, mais juste entre les deux projets. J'ai compilé le nouveau manuellement. Après cela, il a travaillé en douceur.
OriginalL'auteur Serge Desmedt
J'ai rencontré lorsque j'ai renommé un projet (et le nom de l'assembly), qui a été de compter sur un ASP.NET projet. Types dans le site web du projet mis en œuvre dans les interfaces dépendante de l'assemblée. En dépit de l'exécution de Nettoyer la Solution dans le menu générer, l'assemblée avec le nom précédent est resté dans la
bin
dossier, et quand mon projet web exécutécette exception a été levée, pour se plaindre que les méthodes d'interface dans la mise en œuvre de web les types n'ont pas été effectivement mis en œuvre. La suppression manuelle de l'assemblée dans le projet web
bin
dossier résolu le problème.OriginalL'auteur G-Wiz
Je reviens à ce...
Beaucoup de réponses ici, faire un bon travail en expliquant ce qu'est le problème, mais pas comment le résoudre.
La solution à ce problème consiste à supprimer manuellement les fichiers bin dans vos projets publiés répertoire. Il permet de nettoyer toutes les références et force le projet d'utiliser la dernière Dll.
Je vous suggère de ne pas utiliser l'publier des outils de Suppression, car cela a tendance à se jeter hors de IIS.
OriginalL'auteur DJ.
J'ai encore une autre ésotérique solution à ce message d'erreur. J'ai mis à jour ma cible cadre de .Net 4.0 4.6, et mon projet de test d'unité a été de me donner le "Système.TypeLoadException...ne dispose pas d'une mise en œuvre" erreur quand j'ai essayé de construire. Il a également donné un deuxième message d'erreur à propos de la même soi-disant non-mise en œuvre de la méthode qui a dit "La " BuildShadowTask' echec de la tâche de façon inattendue." Aucun des conseils ici semblait l'aider, alors j'ai cherché "BuildShadowTask" et un post sur MSDN qui m'ont conduit à utiliser un éditeur de texte pour supprimer ces lignes à partir de l'unité de projet de test du fichier csproj.
Après, les deux erreurs s'en alla, et le projet de construction.
OriginalL'auteur Tony Pulokas
J'ai aussi eu ce message d'erreur lorsque j'avais déjà permis la Couverture de Code pendant le test unitaire pour l'une des assemblées. Pour une raison quelconque Visual Studio "tampon" de l'ancienne version de cette DLL, même si j'avais mis à jour à la mise en place d'une nouvelle version de l'interface. La désactivation de la Couverture de Code pour se débarrasser de l'erreur.
OriginalL'auteur Kyberias
Une autre explication pour ce type de problème impliquant le C++.
Si vous essayez d'écraser une interface définie dans une assemblée créé à l'aide de C++ managé qui a une signature particulière, vous obtiendrez l'exception lorsque le tampon est créé.
Cela est vrai pour Rhino se moque et probablement tout se moquant de cadre qui utilise
System.Reflection.Emit
.La définition de l'interface obtient la signature suivante:
Noter que le C++ de type
long
cartes àSystem.Int32
(ou simplementint
en C#). Il est un peu obscuremodopt
qui est à l'origine du problème comme l'a déclaré Ayende Rahien sur le Rhino se moque de la liste de diffusion .System::Byte
. J'ai changé la signature d'accepter uneunsigned short
et le ciel est de nouveau bleu.OriginalL'auteur Martin Liversage
Cette erreur peut également survenir si une assemblée est chargée à l'aide de l'Assemblée.LoadFrom(String) et fait référence à un assembly qui a déjà été chargé à l'aide de l'Assemblée.Charge(Byte[]).
Par exemple, vous avez intégré l'application principale est référencé sur les assemblées de ressources, mais votre app charges plugins à partir d'un dossier spécifique.
Au lieu d'utiliser LoadFrom vous devez utiliser la Charge. Le code suivant va faire la job:
OriginalL'auteur FrankCoder
Je viens de mettre une solution de MVC3 à MVC5, et a commencé à recevoir la même exception de mon projet de test d'Unité.
Vérifié toutes les références à la recherche de vieux fichiers, finalement j'ai découvert que j'besoin de faire quelques bindingRedirects pour Mvc, dans mon projet de test d'unité.
OriginalL'auteur shenku
Dans mon cas, il a contribué à réinitialiser les WinForms boîte à outils.
Je suis l'exception lors de l'ouverture d'un
Form
dans le concepteur; cependant, la compilation et l'exécution du code était possible et que le code s'est comporté comme prévu. L'exception s'est produite dans un localUserControl
mise en œuvre d'une interface à partir de l'un de mes référencé bibliothèques. L'erreur est apparue après cette bibliothèque a été mise à jour.Ce
UserControl
a été répertorié dans les WinForms boîte à outils. Probablement Visual Studio gardé une référence sur une version obsolète de la bibliothèque ou a été mise en cache une version obsolète quelque part.Voici comment je l'ai récupéré à partir de cette situation:
Reset Toolbox
dans le menu contextuel. (Cela supprime les objets personnalisés à partir de la boîte à outils).Dans mon cas, les éléments de boîte à outils ont été restaurés à leur état par défaut; toutefois, le Pointeur-flèche était manquant dans la boîte à outils.
Dans mon cas, Visual Studio terminée avec une exception de violation et abandonnée.
Maintenant, tout est en cours d'exécution en douceur.
OriginalL'auteur Olivier Jacot-Descombes
FWIW, je l'ai obtenu lorsqu'il y a un fichier de configuration redirigé vers inexistante de la version de l'assembly référencé. La Fusion des journaux pour la victoire!
OriginalL'auteur Tilman
J'ai eu cette erreur parce que j'ai eu une classe dans une assemblée de " C "qui était sur la version 4.5 du cadre, la mise en œuvre d'une interface en assemblée de" A " qui était sur la version 4.5.1 du cadre et de servir de classe de base à l'assembly 'B', qui était également sur la version 4.5.1 du cadre. Le système a déclenché l'exception, tout en essayant de charger l'assembly 'B'. En outre, j'avais installé les packages nuget ciblage .net 4.5.1 sur l'ensemble des trois assemblées. Pour une raison quelconque, même si le nuget références n'étaient pas en montrant dans l'assembly 'B', il était en train de construire avec succès.
Il s'est avéré que le vrai problème est que les assemblées étaient de référencement différentes versions d'un package nuget qui contenait l'interface et l'interface de signature ont changé entre les versions.
OriginalL'auteur Tolu
Dans mon cas, j'avais déjà fait référence à un
mylib
projet chez un frère dossier en dehors de la repo - disons quev1.0
.Plus tard, je l'ai fait correctement et utilisé via un git sous-module permet d'appel qui
v2.0
.Un projet
consoleApp
cependant n'était pas mis à jour correctement. Il était toujours en faisant référence à l'ancienv1.0
projet à l'extérieur de mon projet git.Point de prêter à confusion, même si le
*.csproj
est totalement faux et pointant versv1.0
, l'IDE de Visual Studio a montré le chemin d'accès que lev2.0
projet!F12 pour inspecter l'interface et la classe est allée à la
v2.0
version trop.L'assemblée placé dans le dossier bin par le compilateur était le
v1.0
version, d'où les maux de tête.Qui fait que l'IDE me mentait fait il est très difficile de réaliser l'erreur.
Solution: Supprimé les références de projet de
ConsoleApp
et readded.Général Conseil: Recompiler toutes les assemblées à partir de zéro (si possible, peut-être pas pour les packages nuget bien sûr) et de vérifier datetime timbres dans
bin\debug
dossier. Tout ancien daté des assemblages de votre problème.OriginalL'auteur fiat
J'ai fait face à la même question. J'ai été me gratter la tête à ce qui est à l'origine de cette erreur.
Je croix cochée, toutes les méthodes ont été mises en œuvre.
Sur Google j'ai eu ce lien parmi d'autres. @Paul McLink commentaire, ces deux étapes ont permis de résoudre le problème.
et la erreur allé.
Redémarrez VS Plugin
Merci Paul 🙂
Espère que cela aide quelqu'un qui viennent à travers ce message d'erreur 🙂
OriginalL'auteur Kgn-web
J'ai aussi rencontré ce problème lors de l'exécution de mon unittests. L'application fonctionnait correctement et sans erreurs.
Le problème dans mon cas est que je n'avais désactivé la construction des projets de test.
Réactivation de la construction de mon testprojects résolu les problèmes.
OriginalL'auteur Wesley
J'ai vu cela dans Visual Studio Pro 2008, lorsque deux projets construits assemblées avec le même nom, une classe lib SDF.dll et celui qui fait référence à l'lib avec le nom de l'assembly sdf.exe.
Quand j'ai changé le nom du référencement de l'assemblée, l'exception s'en alla
OriginalL'auteur N romaai
Voici mon point de vue sur cette erreur.
Ajouté une
extern
méthode, mais ma pâte était défectueux. LeDllImportAttribute
suis mis sur un commentée ligne.Assurer l'attribut a été inclus dans la source de correction du problème.
OriginalL'auteur Will
Je l'ai obtenu dans un service WCF en raison d'avoir un x86 type de construction choisi, provoquant les bisn à vivre dans bin\x86 au lieu de bin. La sélection de n'Importe quel CPU causé la recompilé Dll pour aller à l'emplacement correct (je ne vais pas entrer dans les détails de ce qui s'est passé dans la première place).
OriginalL'auteur Ruben Bartelink
Cela signifie simplement que la mise en œuvre du projet est de date dans mon cas. La DLL contenant l'interface a été reconstruite, mais la mise en œuvre de la dll a été vicié.
OriginalL'auteur TrustyCoder
J'ai eu le même problème. J'ai compris que mon assemblée, qui est chargé par le programme principal, avait quelques références avec "Copie Locale" à true. Ces copies locales de références ont été à la recherche pour d'autres références dans le même dossier, ce qui n'existait pas parce que la "Copie Locale" d'autres références a été défini sur false. Après la suppression de la "accidentellement" copié les références de l'erreur a disparu parce que le programme principal a été définie pour rechercher les emplacements corrects de références. Apparemment, les copies locales des références vissé vers le haut de la séquence de l'appeler parce que ces copies locales ont été utilisés à la place de ceux d'origine présent dans le programme principal.
Le message à retenir est que cette erreur apparaît en raison de l'absence de lien pour charger le nécessaire de montage.
OriginalL'auteur Almis
Dans mon cas, j'ai été de tenter de l'utiliser
TypeBuilder
de créer un type.TypeBuilder.CreateType
jeté cette exception. J'ai finalement réalisé que j'avais besoin d'ajouterMethodAttributes.Virtual
pour les attributs lors de l'appel deTypeBuilder.DefineMethod
pour une méthode qui permet de implémente une interface. C'est parce que sans cet indicateur, la méthode ne permet pas de mettre en œuvre l'interface, mais plutôt une nouvelle méthode avec la même signature à la place (même sans préciserMethodAttributes.NewSlot
).OriginalL'auteur James
Comme un addendum: ce problème peut également se produire si vous mettez à jour un package nuget qui a été utilisé pour générer un faux assemblée. Dites vous installer V1.0 d'un package nuget et de créer un faux assemblée "fakeLibrary.1.0.0.0.Le faux". Ensuite, vous mettez à jour vers la version la plus récente du package nuget, disons v1.1 qui a ajouté une nouvelle méthode d'une interface. La Faux de la bibliothèque est toujours à la recherche de v1.0 de la bibliothèque. Tout simplement supprimer le faux de l'assemblée et de la régénérer. Si c'était le problème, ce sera probablement le fixer.
OriginalL'auteur Chris Peterson
J'ai reçu ce message d'erreur après une récente mise à jour de windows. J'ai eu une classe d'hériter d'une interface. L'interface contenait une signature qui a renvoyé un ValueTuple, une fonctionnalité relativement nouvelle en C#.
Tout ce que je peux deviner, c'est que la mise à jour de windows installé une nouvelle, mais même explicitement référence, la mise à jour de liaison des redirections, etc...Le résultat final était juste changer la signature de la méthode à quelque chose de "standard", je suppose que vous pourriez dire.
OriginalL'auteur Mike_G