Message d'erreur «Impossible de charger un ou plusieurs des types demandés. Récupérez la propriété LoaderExceptions pour plus d'informations. '

347

J'ai développé une application utilisant Entity Framework , SQL Server 2000, Visual Studio 2008 et Enterprise Library.

Cela fonctionne parfaitement bien localement, mais lorsque je déploie le projet dans notre environnement de test, j'obtiens l'erreur suivante:

Impossible de charger un ou plusieurs des types demandés. Récupérez la propriété LoaderExceptions pour plus d'informations

Trace de pile: à System.Reflection.Module._GetTypesInternal (StackCrawlMark & ​​stackMark)

à System.Reflection.Assembly.GetTypes ()

à System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly (contexte LoadingContext)

à System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache (contexte LoadingContext)

sur System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache (assembly Assembly, Boolean loadReferencedAssemblies, Dictionary 2 knownAssemblies, Dictionary2 & typesInLoading, List`1 & errors)

à System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache (ObjectItemCollection objectItemCollection, Assembly assembly, Boolean loadReferencedAssemblies)

à System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType (Type type)

sur System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType (Type de type, Assembly callingAssembly)

sur System.Data.Objects.ObjectContext.CreateQuery [T] (paramètres string queryString, ObjectParameter [])

Entity Framework semble avoir un problème, un indice sur la façon de le résoudre?

La lumière
la source
Il n'y a pas de solution miracle pour résoudre ce problème, mais cette réponse vous aidera à connaître la raison très exacte stackoverflow.com/a/8824250/185022
AZ_

Réponses:

105

J'ai résolu ce problème en définissant l'attribut Copy Local des références de mon projet sur true.

Mentoliptus
la source
33
Lorsque nous continuons à explorer les exceptions internes jusqu'à ce que nous voyions l'exception de type ReflectionTypeLoadException et qu'il possède une propriété "LoaderExceptions" qui donne les informations sur les informations DLL manquantes ou incompatibles. Ensuite, nous pouvons prendre en charge les actions appropriées à partir de là.
Sai
19
eh bien, c'est bien lorsque vous déboguez à partir de Visual Studio. Mais qu'en est-il si votre application Web ne lance cette erreur que sur le serveur de production? même après avoir défini l'attribut Copy Local sur true.
Yousi
2
Il s'agit d'une solution au problème sur un serveur de production, pas sur un Visual Studio local. Copier local copie la DLL référencée au moment de la génération et la DLL est d'abord recherchée dans le même dossier que l'application en cours d'exécution. Le problème peut persister si vous n'avez pas copié la DLL qui a été copiée au moment de la construction dans le dossier correct sur le serveur de production.
Mentoliptus du
Dans mon cas, j'ai également dû ajouter une référence de nuget à Microsoft.AspNetCore.Mvc.ViewFeatures
MFedatto
530

Cette erreur n'a pas de vraie réponse magique. La clé est d'avoir toutes les informations pour comprendre le problème. Il est fort probable qu'un assemblage chargé dynamiquement manque un assemblage référencé. Cet assembly doit se trouver dans le répertoire bin de votre application.

Utilisez ce code pour déterminer ce qui manque.

using System.IO;
using System.Reflection;
using System.Text;

try
{
    //The code that causes the error goes here.
}
catch (ReflectionTypeLoadException ex)
{
    StringBuilder sb = new StringBuilder();
    foreach (Exception exSub in ex.LoaderExceptions)
    {
        sb.AppendLine(exSub.Message);
        FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
        if (exFileNotFound != null)
        {                
            if(!string.IsNullOrEmpty(exFileNotFound.FusionLog))
            {
                sb.AppendLine("Fusion Log:");
                sb.AppendLine(exFileNotFound.FusionLog);
            }
        }
        sb.AppendLine();
    }
    string errorMessage = sb.ToString();
    //Display or log the error based on your application.
}
Ben Gripka
la source
4
Merci! Cela devrait faire partie de toute configuration de journalisation dans les systèmes qui utilisent MEF.
Bogi lenvig
4
Si je pouvais voter à chaque fois que je reviens à cette réponse, il y aurait environ 5 votes supplémentaires ... et compter
sǝɯɐſ
2
Tu m'as sauvé la vie. Merci beaucoup. Je n'aurais JAMAIS trouvé le problème. C'était une ancienne DLL que je n'utilisais plus, se cachant profondément dans la structure de mon projet et causant ce problème.
richard
4
juste pour découvrir rapidement ce qui manque, utiliser throw new Exception(errorMessage);, l'espoir aide quelqu'un.
shaijut
2
Sans aucun code supplémentaire, dans Visual Studio, allez dans Paramètres d'exception et mettez dans la zone de recherche TypeLoadException puis activez les cases à cocher du couple hits. De plus, vous devrez peut-être désactiver les options de la section de débogage «Juste mon code» afin de pouvoir détecter l'exception lorsque cela se produit dans une dépendance que vous n'avez pas écrite.
David Burg
56

Une solution qui a fonctionné pour moi a été de supprimer les dossiers bin / et obj / et de reconstruire la solution.

Kenny Eliasson
la source
J'ai dû reconstruire le projet de test lui-même, je ne sais pas si vous faites référence au projet de test ici ou au projet que vous testez.
Jason Axelson
4
Un autre commentaire: cliquez avec le bouton droit sur le nœud Solution dans "l'Explorateur de solutions" et cliquez sur "Nettoyer la solution", puis sur "Reconstruire la solution". (S'il y a un nouvel ajout dans votre projet source - autres projets dans votre solution - partie (s), cela entraîne la
répercussion
J'avais ce problème. Comme suggéré, j'ai fermé Visual Studio, dossier bin supprimé, rouvert le projet et reconstruit et il a réussi.
Sagar S.
Cela se produisait lorsque je changeais de branche avec des changements importants. La suppression du bac a fonctionné. Le nettoyage et la reconstruction ne fonctionnaient PAS.
JGTaylor
33

Deux solutions possibles:

  1. Vous compilez en mode Release mais déployez une version compilée plus ancienne à partir de votre répertoire Debug (ou vice versa).
  2. Vous n'avez pas la version correcte du .NET Framework installée dans votre environnement de test.
William Edmondson
la source
J'ai eu le même problème, le point 1 était précis pour moi. Merci William.
Matthew
J'ai ce même problème ... J'ai parcouru les deux suggestions et je reçois toujours la même erreur :(
David Kiff
Cela peut également se produire si votre DLL référencée est "bloquée". Faites un clic droit dessus et sélectionnez "débloquer"
Ben
3
A également constaté que cela se produisait si l'un des projets DLL était défini pour générer "x64" au lieu de "Any CPU".
DCastenholz
# 1 peut se produire si la configuration de la solution est incorrecte - projet non sélectionné pour la construction, par exemple après avoir supprimé et ajouté à nouveau le projet à la solution
surfen
13

Comme cela a été mentionné précédemment, c'est généralement le cas d'une assemblée qui n'est pas là.

Pour savoir exactement quel assembly vous manque, attachez votre débogueur, définissez un point d'arrêt et lorsque vous voyez l'objet d'exception, accédez à la propriété «LoaderExceptions». L'assemblage manquant devrait être là.

J'espère que cela aide!

mkorman
la source
1
Nous pouvons également continuer à explorer les exceptions internes jusqu'à ce que nous voyions l'exception de type ReflectionTypeLoadException et qu'il possède une propriété "LoaderExceptions" qui donne les informations sur les informations DLL manquantes ou incompatibles.
Sai
2
Dans une solution avec plusieurs projets, comment pouvons-nous voir quel projet est à l'origine du problème dans LoaderExceptions? Je vois que System.Web.Mvc est introuvable, mais je ne sais pas lequel des 20 projets de cette solution pourrait avoir des problèmes.
mrcoulson
9

La solution consistait à vérifier l'exception LoaderException: dans mon cas, certains fichiers DLL étaient manquants.

Entrez la description de l'image ici

Dev
la source
6

Assurez-vous d'autoriser les applications 32 bits sur IIS si vous avez déployé sur IIS. Vous pouvez définir cela sur les paramètres de votre pool d'applications actuel.

MrKhal
la source
6

J'ai rencontré cette erreur avec une application ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4.

Cela fonctionnerait bien sur ma machine de développement (Windows Vista 64 bits). Ensuite, une fois déployé sur le serveur ( Windows Server 2008 R2 SP1), cela fonctionnerait jusqu'à l'expiration de la session. Donc, nous déployions l'application et tout semblait bien, puis nous la laissions plus de 20 minutes avant l'expiration de la session, puis cette erreur était levée.

Pour le résoudre, j'ai utilisé ce code sur le blog de Ken Cox pour récupérer la propriété LoaderExceptions.

Pour ma situation, la DLL manquante était Microsoft.ReportViewer.ProcessingObjectModel(version 10). Cette DLL doit être installée dans le GAC de la machine sur laquelle l'application s'exécute. Vous pouvez le trouver dans le package redistribuable Microsoft Report Viewer 2010 disponible sur le site de téléchargement Microsoft.

doyen
la source
5

Au départ, j'ai essayé la visionneuse de journaux Fusion, mais cela n'a pas aidé alors j'ai fini par utiliser WinDbg avec l'extension SOS.

! dumpheap -stat -type Exception / D

Ensuite, j'ai examiné les FileNotFoundExceptions. Le message dans l'exception contenait le nom de la DLL qui n'était pas en cours de chargement.

NB, le / D vous donne des résultats avec un lien hypertexte, alors cliquez sur le lien dans le résumé de FileNotFoundException. Cela fera apparaître une liste des exceptions. Cliquez ensuite sur le lien pour l'une des exceptions. Cela va! Dumpobject que les exceptions. Ensuite, vous devriez juste être en mesure de cliquer sur le lien pour Message dans l'objet d'exception, et vous verrez le texte.

miko
la source
4

Mon instance de ce problème a fini par être une référence manquante. Un assembly était référencé dans app.config mais n'avait pas de référence dans le projet.

SteveCav
la source
3

Si vous utilisez Entity Framework , essayez de copier localement les références suivantes.

  • System.Data.Entity
  • System.Web.Entity

Remplacez la propriété «Copier local» par «Vrai» pour ces références et publiez.

SameerPc
la source
3

Une autre solution pour savoir pourquoi rien ne fonctionne exactement (depuis Microsoft connect):

  1. Ajoutez ce code au projet:

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
  2. Désactivez les assemblys de sérialisation de génération.

  3. Construisez et exécutez.
Siarhei Kuchuk
la source
2

J'ai eu une application Web .NET 4.0, ASP.NET MVC 2.0, Entity Framework 4.0 développée dans Visual Studio 2010. J'ai eu le même problème, cela fonctionnait sur un serveur Windows Server 2008 R2 mais pas sur un autre serveur Windows Server 2008 R2, même si les versions de .NET et ASP.NET MVC étaient les mêmes, lançant cette même erreur que la vôtre.

Je suis allé suivre la suggestion de miko, j'ai donc installé Windows SDK v7.1 (x64) sur le serveur défaillant, afin de pouvoir exécuter! Dumpheap.

Eh bien, il s'avère que l'installation du SDK Windows v7.1 (x64) a résolu le problème. La dépendance manquante doit avoir été incluse dans le SDK. Il peut être téléchargé à partir du SDK Microsoft Windows pour Windows 7 et .NET Framework 4 .

Mafi Osori
la source
2

Ajouter mon problème / solution spécifique à cela car c'est le premier résultat pour ce message d'erreur. Dans mon cas, l'erreur a été reçue lorsque j'ai déployé une deuxième application dans le dossier de ma première application dans IIS . Les deux définissaient une chaîne de connexion avec le même nom, ce qui entraînait un conflit dans l'application enfant et générait à son tour ce message d'erreur non évident. Il a été résolu en ajoutant:

<clear/>

dans le bloc de chaînes de connexion de l'application Web enfant, ce qui l'a empêchée d'hériter des chaînes de connexion des fichiers web.config plus haut dans la hiérarchie.

<connectionStrings>
  <clear/>
  <add name="DbContext" connectionString="MySERVER" providerName="System.Data.SqlClient" />
</connectionStrings>

Une question de référence sur le débordement de pile qui m'a aidé une fois que j'ai déterminé ce qui se passait était une application enfant hériterait-elle de son parent web.config? .

Matthieu
la source
2

Cela a fonctionné pour moi. Ajoutez-le dans votre web.config

<system.web>
  <trust level="Full" />
Rahul Nikate
la source
J'ai eu cette erreur:It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.
2

Mon problème a été résolu après avoir supprimé les fichiers d'assemblage redondants du bindossier.

user2814851
la source
2

Au cas où aucune des autres réponses ne vous aiderait:

Lorsque j'ai eu ce problème, il s'est avéré que mon service Windows était conçu pour une plate-forme x64 et que j'exécutais par inadvertance la version 32 bits d'InstallUtil.exe. Assurez-vous donc que vous utilisez la bonne version d'InstallUtil pour la plate-forme pour laquelle vous avez construit.

jkindwall
la source
J'ai eu un problème similaire. Certaines DLL que mon service utilisait ont été compilées pour un processeur 32 bits, changées en n'importe quel processeur et cela fonctionne maintenant.
Blake Thingstad
1

D'autres suggestions sont toutes bonnes. Dans mon cas, le problème était que la boîte de développeur était une machine 64 bits utilisant l'emplacement x86 de diverses API, y compris Silverlight .

En modifiant la plate-forme cible pour qu'elle corresponde au serveur 32 bits sur lequel l'application Web était déployée, la plupart des erreurs liées à l'impossibilité de charger un ou plusieurs des types demandés ont été supprimées.

rclopez
la source
1

J'ai changé la propriété de version spécifique des réfrences à false et cela a aidé.

Dov Miller
la source
1

J'ai eu le même message d'erreur signalé lors de la compilation d'un package Visual Studio (VSPackage). La solution entière se compile et l'erreur est levée lorsque le package est créé par CreatePkgDef. Cela dit, il est clair que je ne peux pas intercepter les LoaderExceptions car ce n'est pas mon application qui le lance, mais le propre outil de Microsoft. (Bien que je sois responsable de la confusion de CreatePkgDef.)

Dans mon cas, la cause principale était que ma solution crée un MyDll.dll qui a déjà été enregistré auprès du GAC (et ils sont différents), donc le CreatePgkDef a confondu lequel utiliser et il a décidé de simplement lancer une erreur qui n'est pas '' t vraiment utile. Le MyDll.dll dans le GAC a été enregistré par l'installateur du même produit (évidemment une version antérieure, avec un contenu / légèrement / différent).

Comment le réparer

  1. Méthode préférée: assurez-vous d'utiliser la version correcte de MyDll.dll
    1. Lors de la compilation de votre projet, assurez-vous d'utiliser un numéro de version différent de celui utilisé dans la version précédente située dans le GAC. Assurez-vous que les attributs suivants sont corrects:
      • [assembly: AssemblyVersion ("1.0.0.1")] // En supposant que l'ancien fichier DLL a été versionné 1.0.0.0
      • [assembly: AssemblyFileVersion ("1.0.0.1")] // En supposant que l'ancien fichier DLL a été versionné 1.0.0.0
    2. Si nécessaire, spécifiez le nom d'assembly complet (par exemple, "MyDll.dll, Version = 1.0.0.1, Culture = neutral, PublicKeyToken = 1234567890abcdef") lorsque vous le référencez dans vos autres projets.
  2. Si l'échec ci-dessus échoue: vous pouvez désinstaller l'ancien MyDll.dll de GAC
    1. Comment désinstaller un assemblage du GAC
    2. Désinstallez l'application qui inclut MyDll.dll

Changer la version d'Assembly était assez bon pour moi. :)

J'espère que cela a été utile.

Shakaron
la source
1

J'ai eu le même problème (mais sur mon local) lorsque j'essayais d'ajouter la migration Entity Framework avec Package Manager Console.

J'ai résolu le problème en créant une application console où Main () avait le code suivant:

 var dbConfig = new Configuration();
 var dbMigrator = new DbMigrator(dbConfig);
 dbMigrator.Update();

Assurez-vous que la classe Configuration est la configuration de migration de votre projet en échec. Vous aurez besoin de System.Data.Entity.Migrations pour utiliser DbMigrator.

Définissez un point d'arrêt dans votre application et exécutez-le. L'exception doit être interceptée par Visual Studio (sauf si vous avez défini ce type d'exception pour ne pas interrompre la session de débogage), et vous devriez pouvoir trouver les informations que vous recherchez.

La référence manquante dans mon cas était EFProviderWrapperToolkit.

Peter Nagy
la source
1

J'ai eu ce problème lorsque j'ai installé un package NuGet sur l'un des projets et oublié de mettre à jour l'autre projet.

J'ai résolu ce problème en créant simplement les deux projets ayant le même assemblage de référence.

jayson.centeno
la source
Merci pour le lien! Je n'avais aucune idée de ce qu'était NuGet.
jebar8
1

Cela m'est arrivé aussi. J'ai résolu le problème comme suit: Cliquez avec le bouton droit sur Solution, Gérez les packages NuGet pour la solution ... Consolidez les packages et mettez à niveau les packages pour qu'ils soient dans la même version.

user1760527
la source
0

Définissez le mode IIS 32 bits sur true, le mode de débogage sur true dans le fichier de configuration, la suppression du temprépertoire et la réinitialisation d'IIS corrige le problème temporairement et il revient après un certain temps.

johnny
la source
0

Vérifiez que chacun de vos projets est correctement installé dans Configuration Manager .

Semblable à la raison de William Edmondson pour ce problème, j'ai changé mon paramètre Configuration Manager de "Debug" "Any CPU" à "Debug" ".NET". Le problème était que la version ".NET" n'était PAS configurée pour générer TOUS les projets, donc certaines de mes DLL étaient obsolètes (tandis que d'autres étaient à jour). Cela a causé de nombreux problèmes lors du démarrage de l'application.

Le correctif temporaire consistait à faire la suggestion de Kenny Eliasson de nettoyer les répertoires \ bin et \ obj. Cependant, dès que j'apportais plus de modifications aux projets non compilables, tout échouait à nouveau.

cat5dev
la source
0

J'ai également rencontré ce problème lors de la création d'un nouveau complément Microsoft Word avec Visual Studio 2015. Le problème concerne la présence de 2 versions de MS Office, 2013 et 2016. Je désinstalle MS Office 2013, puis cela fonctionne.

amzdmt
la source
0

Je construis quelques projets pour SharePoint et, bien sûr, je les déploie. Une fois, c'est arrivé.

J'ai trouvé un ancien assembly dans C: \ Windows \ assembly \ temp \ xxx (avec FarManager), je l'ai supprimé après le redémarrage et tous les projets ont été créés.

J'ai une question pour MSBuild, car dans les assemblys de projet liés comme des projets et chaque assembly est marqué "Copier local", mais pas du GAC.

Il y a
la source
0

Je suis en mesure de résoudre ce problème en marquant "Copy Local = True" sur tous les fichiers DLL référencés dans le projet, en reconstruisant et en déployant sur un serveur de test.

Srinivasa Rao
la source
0

J'ai eu un problème avec Automap. Dans le bindossier, le fichier automap.4net.dll était là, mais pour une raison quelconque, automap.xml et automap.dll ne l'étaient pas. Les copier dans le binrépertoire a résolu le problème.

alex440
la source