372 votes

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

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

Tout fonctionne parfaitement en local, mais lorsque je déploie le projet sur notre environnement de test, je reçois l'erreur suivante :

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

Stack trace : at System.Reflection.Module._GetTypesInternal(StackCrawlMark& stackMark)

at System.Reflection.Assembly.GetTypes()

at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly(LoadingContext context)

at System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache(LoadingContext context)

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

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

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

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

at System.Data.Objects.ObjectContext.CreateQuery[T](String queryString, ObjectParameter[] parameters)

Il semble y avoir un problème avec Entity Framework, avez-vous une idée de comment le résoudre ?

0 votes

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

0 votes

J'ai résolu le problème en supprimant tous les fichiers d'Azure et en redéployant l'API.

566voto

Ben Gripka Points 4885

Cette erreur n'a pas de réponse magique en un seul coup. La clé est d'avoir toutes les informations nécessaires pour comprendre le problème. Il est très probable qu'une assembly chargée dynamiquement ne contienne pas une assembly référencée. Cette 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
{
    //Le code qui provoque l'erreur va ici.
}
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();
    //Affichez ou enregistrez l'erreur en fonction de votre application.
}

0 votes

Merci ça m'a aidé. Mais pour une raison quelconque (avoir des exceptions à plusieurs couches dans mon cas) la ligne dans le code ci-dessus "catch (ReflectionTypeLoadException ex)" n'a pas fonctionné pour moi mais j'ai pu voir ce type d'exception dans mes InnerExceptions (ReflectionTypeLoadException) et j'ai pu identifier les informations de DLL non correspondantes à partir de LoaderExceptions.

4 votes

Merci! Cela devrait faire partie de toute configuration de journalisation dans les systèmes qui utilisent MEF.

4 votes

Si je pouvais voter à chaque fois que je reviens sur cette réponse, elle aurait environ 5 votes de plus... et ça continue de monter

109voto

Mentoliptus Points 1414

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

40 votes

Lorsque nous continuons à approfondir les exceptions internes jusqu'à ce que nous voyions l'exception de type ReflectionTypeLoadException et qu'elle ait une propriété "LoaderExceptions" qui donne des informations sur les informations manquantes ou non concordantes des DLL. Ensuite, nous pouvons prendre les mesures appropriées à partir de là.

23 votes

Eh bien, c'est bien lorsque vous déboguez depuis Visual Studio. Mais que se passe-t-il si votre application web ne lance cette erreur que sur le serveur de production ? même après avoir défini l'attribut Copier en local sur true.

2 votes

Voici une solution pour le problème sur un serveur de production, pas sur un Visual Studio local. Copy Local copie le fichier DLL de référence au moment de la génération et le DLL est d’abord recherché dans le même dossier que l'application en cours d'exécution. Le problème pourrait persister si vous n'avez pas copié le DLL qui a été copié lors de la génération dans le bon dossier sur le serveur de production.

71voto

Kenny Eliasson Points 1166

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

Mise à jour :

Ou vous pouvez essayer de cliquer avec le bouton droit sur le nœud Solution dans l' "Explorateur de solutions" et cliquer sur "Nettoyer la solution", puis cliquer sur "Reconstruire la solution" (merci Emre Guldogan)

0 votes

J'ai dû reconstruire le projet de test lui-même, je ne suis pas sûr si vous faites référence au projet de test ici ou au projet que vous testez.

6 votes

Un autre Re-commentaire : Faites un clic droit sur le nœud Solution dans l'explorateur de solutions et cliquez sur "Nettoyer la solution", puis cliquez sur "Reconstruire la solution". (S'il y a une nouvelle addition dans votre projet source - autres projets dans votre solution - partie(s), cela provoque les modifications à être réfléchies dans votre dossier de dll du projet et résout ce problème)

0 votes

J'avais ce problème. Comme suggéré, j'ai fermé Visual Studio, supprimé le dossier bin, rouvert le projet et reconstruit et c'était réussi.

36voto

William Edmondson Points 1962

Deux solutions possibles :

  1. Vous compilez en mode Release mais déployez une version compilée plus ancienne depuis votre répertoire Debug (ou vice versa).
  2. Vous n'avez pas la version correcte du framework .NET installée dans votre environnement de test.

0 votes

J'ai eu le même problème, le point 1 était précis pour moi. Merci William.

0 votes

J'ai le même problème... J'ai suivi les deux suggestions et je reçois toujours la même erreur :(

0 votes

Il peut également arriver que votre DLL référencée soit "bloquée". Cliquez dessus avec le bouton droit de la souris et sélectionnez "débloquer"

15voto

mkorman Points 103

Comme cela a été mentionné précédemment, il s'agit généralement d'une assemblée qui manque.

Pour savoir exactement quelle assemblée vous manque, attachez votre débogueur, définissez un point d'arrêt et lorsque vous voyez l'objet d'exception, explorez la propriété 'LoaderExceptions'. L'assemblée manquante devrait s'y trouver.

J'espère que cela vous aidera!

1 votes

Aussi, nous pouvons continuer à approfondir les exceptions internes jusqu'à ce que nous obtenions l'exception du type ReflectionTypeLoadException et elle possède une propriété "LoaderExceptions" qui donne des informations sur des informations manquantes ou incompatibles de DLL.

2 votes

Dans une solution avec plusieurs projets, comment pouvons-nous voir quel projet cause le problème dans LoaderExceptions? Je vois que System.Web.Mvc ne peut pas être trouvé, mais je ne sais pas lequel des 20 projets dans cette solution pourrait avoir des problèmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X