Impossible de charger le type à partir d'une erreur d'assemblage

120

J'ai écrit le test simple suivant pour essayer d'apprendre l'interface Fluent de Castle Windsor:

using NUnit.Framework;
using Castle.Windsor;
using System.Collections;
using Castle.MicroKernel.Registration;

namespace WindsorSample {
    public class MyComponent : IMyComponent {
        public MyComponent(int start_at) {
            this.Value = start_at;
        }
        public int Value { get; private set; }
    } 
    public interface IMyComponent {
        int Value { get; }
    }

    [TestFixture]
    public class ConcreteImplFixture {
        [Test]
        public void ResolvingConcreteImplShouldInitialiseValue() {
            IWindsorContainer container = new WindsorContainer();
            container.Register(Component.For<IMyComponent>().ImplementedBy<MyComponent>().Parameters(Parameter.ForKey("start_at").Eq("1")));
            IMyComponent resolvedComp = container.Resolve<IMyComponent>();
            Assert.AreEqual(resolvedComp.Value, 1); 
        }
    }
}

Lorsque j'exécute le test via TestDriven.NET, j'obtiens l'erreur suivante:

System.TypeLoadException : Could not load type 'Castle.MicroKernel.Registration.IRegistration' from assembly 'Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc'.
at WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue()

Lorsque j'exécute le test via l'interface graphique NUnit, j'obtiens:

WindsorSample.ConcreteImplFixture.ResolvingConcreteImplShouldInitialiseValue:
System.IO.FileNotFoundException : Could not load file or assembly 'Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc' or one of its dependencies. The system cannot find the file specified.

Si j'ouvre l'assemblage auquel je fais référence dans Reflector, je peux voir que ses informations sont:

Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc

et qu'il contient définitivement Castle.MicroKernel.Registration.IRegistration

Que pourrait-il se passer?

Je dois mentionner que les binaires sont tirés de la dernière version de Castle bien que je n'ai jamais travaillé avec nant, donc je n'ai pas pris la peine de recompiler à partir des sources et j'ai juste pris les fichiers dans le répertoire bin. Je dois également souligner que mon projet se compile sans problème.

George Mauer
la source

Réponses:

111

L'assembly se trouve-t-il dans le Global Assembly Cache (GAC) ou à un endroit où il peut remplacer l'assembly que vous pensez être chargé? C'est généralement le résultat d'un assemblage incorrect en cours de chargement, cela signifie pour moi que j'ai généralement quelque chose dans le GAC qui remplace la version que j'ai dans bin / Debug.

Eric Schoonover
la source
1
J'ai ajouté les assemblys en parcourant les fichiers dll, donc le GAC ne devrait pas entrer dans l'équation. Faites également un clic droit sur l'assemblage -> ouvrir dans le réflecteur de l'explorateur de solutions pour le faire apparaître dans le réflecteur avec toutes les informations que j'attendrais
George Mauer
7
Peu importe comment vous l'avez ajouté si un assembly avec le même nom / version existe dans le GAC, il chargera celui-là.
Eric Schoonover le
1
VS.NET répertoriera le chemin d'accès à l'assemblage que vous sélectionnez et Reflector ouvrira l'assemblage de droite, mais lorsque l'application exécutera le runtime .NET, il chargera l'assembly GAC.
Eric Schoonover le
11
C'est la deuxième fois que cette réponse me sauve les fesses. Je voterais à nouveau si je le pouvais.
whybird
17
(GAK. Dites-le à voix haute. Le son même du nom vous avertit de ce à quoi il ressemble.)
whybird
131

Si vous avez un projet référençant un autre projet (tel qu'un type «Application Windows» faisant référence à une «Bibliothèque de classes») et que les deux ont le même nom d'assembly, vous obtiendrez cette erreur. Vous pouvez soit nommer fortement le projet référencé, soit (encore mieux) renommer l'assemblage du projet de référencement (sous l'onglet 'Application' des propriétés du projet dans VS).

AndrewS
la source
De plus: essayez de nettoyer le dossier de sortie. Probablement, le changement de nom de la bibliothèque peut provoquer le même problème, car les deux (ancien et nouveau) seront placés dans le même dossier de sortie.
Manushin Igor
Si vous coupez + collez un projet et ne modifiez pas correctement tous les champs, cela peut entraîner ce problème!
Michael Parker
1
C'était tout pour moi, j'avais déjà référencé l'assembly dans la bibliothèque de classes référencée. J'ai dû aller dans le fichier web.config de mon projet Web et supprimer la référence <dependantAssembly> après avoir désinstallé le package dans nuGet pour le faire fonctionner.
Ivan
16

La solution à cela pour moi n'a pas été mentionnée ci-dessus, alors j'ai pensé ajouter ma réponse à la longue queue ...

J'ai fini par avoir une ancienne référence à une classe (an HttpHandler) dans web.config qui n'était plus utilisée (et n'était plus une référence valide). Pour une raison quelconque, il a été ignoré lors de l'exécution dans Studio (ou peut-être que cette classe est toujours accessible dans ma configuration de développement?) Et je n'ai donc eu cette erreur qu'une fois que j'ai essayé de déployer sur IIS. J'ai cherché le nom de l'assembly dans web.config, supprimé la référence de gestionnaire inutilisée, puis cette erreur a disparu et tout fonctionne très bien. J'espère que ceci aide quelqu'un d'autre.

Brian Moeskau
la source
1
Il y avait quelque chose de très similaire, la seule différence était que la référence web.config à la DLL était toujours déployée dans le répertoire bin. Ce binaire, à son tour, faisait référence à une ancienne version d'une DLL partagée qui a provoqué l'exception.
santos
10

J'ai eu le même problème et pour moi cela n'avait rien à voir avec l'espace de noms ou la dénomination du projet.

Mais comme plusieurs utilisateurs l'ont laissé entendre, cela avait à voir avec un ancien assemblage toujours référencé.

Je recommande de supprimer tous les dossiers "bin" / binaires de tous les projets et de reconstruire la solution entière. Cela a éliminé tous les assemblages potentiellement obsolètes et après cela, MEF a exporté tous mes plugins sans problème.

Matthias Wolf
la source
8

J'obtenais cette erreur et rien de ce que j'ai trouvé sur StackOverflow ou ailleurs ne l'a résolu, mais la réponse de bmoeskau à cette question m'a orienté dans la bonne direction pour le correctif, qui n'a pas encore été mentionné comme réponse. Ma réponse n'est pas strictement liée à la question d'origine, mais je la poste ici en supposant que quelqu'un ayant ce problème trouvera le chemin ici en recherchant sur Google ou quelque chose de similaire (comme moi dans un mois lorsque cela me mord à nouveau , arg!).

Mon assemblage est dans le GAC, il n'y a donc théoriquement qu'une seule version de l'assemblage disponible. Sauf que IIS met en cache l'ancienne version et me donne cette erreur. Je venais de changer, reconstruire et réinstaller l'assemblage dans le GAC. Une solution possible consiste à utiliser le Gestionnaire des tâches pour tuer w3wp.exe . Cela force IIS à relire l'assembly à partir du GAC: problème résolu.

Michael Maddox
la source
3

La version = 1.0.3.0 indique Castle RC3, mais l'interface fluide a été développée quelques mois après la sortie de RC3. Par conséquent, il semble que vous ayez un problème de version. Peut-être que Castle RC3 est enregistré dans le GAC et qu'il l'utilise ...

Mauricio Scheffer
la source
Intéressant, j'ai la dernière version ici: builds.castleproject.org/cruise/DownloadBuild.castle?number=956 C'est ce qu'ils ont recommandé sur leur forum. Aussi si c'était le cas, j'imagine que le projet ne se compilerait pas du tout. Mais cela ne pose aucun problème
George Mauer
Quant à avoir la version dans le GAC, je le fais probablement, mais je n'ai pas ajouté la référence du GAC et l'utilisation du réflecteur sur la référence indique que c'est celle que je pensais
George Mauer
Essayez de supprimer l'assembly en double du GAC, je suis prêt à être que c'est votre problème.
Eric Schoonover le
3

Je reçois ça de temps en temps et ça a toujours été pour avoir l'assemblée dans le GAC

SteveC
la source
3

Si cette erreur est causée par la modification de l'espace de noms, assurez-vous que le dossier de ce projet est renommé avec le même nom, et fermez VS.NET Modifiez le projet qui a le problème avec le Bloc-notes et remplacez-y les nœuds

"RootNamespace> New_Name_Of_Folder_Of_Your_Project_Namespace" RootNamespace> "AssemblyName> New_Name_Of_Folder_Of_Your_Project_Namespace" AssemblyName>

Iadine GOUNDETE
la source
3

La suppression de mon fichier .pdb pour la DLL a résolu ce problème pour moi. Je suppose que cela a quelque chose à voir avec le fait que la dll a été créée à l'aide d'ILMerge.

Shelby115
la source
C'était tout pour moi! Je ne sais pas ce qu'est ILMerge mais Epicor n'aimait pas avoir le fichier pdb à côté de mon assemblage.
MDave
Pas d'ILMerge, mais la suppression de tous les fichiers PDB a résolu le problème.
hogarth45
3

Lorsque je rencontre un tel problème, je trouve l'outil FUSLOGVW très utile. Il vérifie les informations de liaison d'assembly et les enregistre pour vous. Parfois, les bibliothèques manquent, parfois GAC a différentes versions qui sont en cours de chargement. Parfois, la plate-forme des bibliothèques référencées est à l'origine des problèmes. Cet outil explique clairement comment les liaisons des dépendances sont résolues et cela peut vraiment vous aider à étudier / déboguer votre problème.

Visionneuse de journal de fusion / fuslogvw / Visionneuse de journal de liaison d'assemblage. Vérifiez plus / téléchargez ici: http://msdn.microsoft.com/en-us/library/e74a18c4.aspx .

Jakub Szumiato
la source
Existe-t-il un moyen de faire fonctionner FUSLOGVW avec Visual Studio Designer? Visual Studio Designer lève une exception lorsque j'essaie de modifier l'une de mes boîtes de dialogue ("Méthode non trouvée"), pour une méthode dont je sais qu'elle existe (l'application fonctionne correctement). Pour autant que je puisse voir, rien ne s'affiche dans FUSLOGVW lors de la modification de quelque chose dans Visual Studio Designer.
Jimmy
3

J'ai eu ce problème après avoir factorisé un nom de classe:
Could not load type 'Namspace.OldClassName' from assembly 'Assembly name...'.

L'arrêt d'IIS et la suppression du contenu dans l'ont Temporary ASP.NET Filescorrigé pour moi.

En fonction de votre projet (32/64 bits, version .net, etc.) le correct Temporary ASP.NET Filesdiffère:

  • 64 bits
    %systemroot%\Microsoft.NET\Framework64\{.netversion}\Temporary ASP.NET Files\
  • 32 bits
    %systemroot%\Microsoft.NET\Framework\{.netversion}\Temporary ASP.NET Files\
  • Sur ma machine de développement, c'était (parce que c'est peut-être IIS Express?)
    %temp%\Temporary ASP.NET Files
CJSewell
la source
3

Peut-être pas aussi probable, mais pour moi, cela a été causé par mon application essayant de charger une bibliothèque avec le même nom d'assembly (xxx.exe chargeant xxx.dll).

ReflexiveCode
la source
2

Rencontrez cela avec une autre cause:

exécution de tests unitaires en mode version mais la bibliothèque en cours de chargement était la version en mode débogage qui n'avait pas été mise à jour

jk.
la source
2

Encore une autre solution: les anciennes DLL pointant les unes vers les autres et mises en cache par Visual Studio dans

C:\Users\[yourname]\AppData\Local\Microsoft\VisualStudio\10.0\ProjectAssemblies

Quittez VS, supprimez tout ce qui se trouve dans ce dossier et Bob est votre oncle.

homme souriant
la source
2

J'ai eu le même problème. Je viens de résoudre ce problème en mettant à jour l'assemblage via GAC.

Pour utiliser gacutil sur une machine de développement, accédez à: Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010) .

J'ai utilisé ces commandes pour désinstaller et réinstaller respectivement.

gacutil /u myDLL

gacutil /i "C:\Program Files\Custom\mydllname.dll"

Remarque: je n'ai pas désinstallé ma dll dans mon cas, je viens de mettre à jour la dll avec le chemin actuel.

gaurav
la source
2

J'ai rencontré ce scénario en essayant de charger un type (via la réflexion) dans un assemblage qui a été construit avec une version différente d'une référence commune à l'application où cette erreur est apparue.

Comme je suis sûr que le type est inchangé dans les deux versions de l'assembly, j'ai fini par créer un résolveur d'assemblage personnalisé qui mappe l'assembly manquant à celui que mon application a déjà chargé. Le moyen le plus simple est d'ajouter un constructeur statique à la classe de programme comme ceci:

using System.Reflection
static Program()
{
    AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => {
        AssemblyName requestedName = new AssemblyName(e.Name);

        if (requestedName.Name == "<AssemblyName>")
        {
            // Load assembly from startup path
            return Assembly.LoadFile($"{Application.StartupPath}\\<AssemblyName>.dll");
        }
        else
        {
            return null;
        }
    };
}

Cela suppose bien entendu que l'assemblage se trouve dans le chemin de démarrage de l'application et peut être facilement adapté.

JBartlau
la source
Je dois noter que cette solution s'applique aux cas où vous donnez vos assemblages à des tiers et ne pouvez pas vous assurer que tout le monde se met à jour juste à temps lorsque vous le faites. Sinon, une recompilation avec les références corrigées est préférable.
JBartlau
2

Rencontrez cela avec une autre cause:

J'utilisais un assemblage fusionné créé avec ILRepack. L'assembly à partir duquel vous interrogez les types doit être le premier passé à ILRepack, sinon ses types ne seront pas disponibles.

Jenny O'Reilly
la source
1

Cela se produit généralement lorsque vous avez une version de votre assembly déployée dans le GAC mais n'a pas été mise à jour avec de nouvelles classes que vous avez peut-être ajoutées à l'assembly sur votre IDE. Par conséquent, assurez-vous que l'assembly sur le GAC est mis à jour avec les modifications que vous avez peut-être apportées à votre projet.

Par exemple, si vous avez une bibliothèque de classes de Common et dans cette bibliothèque de classes, vous avez le type Common.ClassA et déployez-le sur le GAC fortement nommé. Vous venez plus tard et ajoutez un autre type appelé Common.ClassB et vous exécutez votre code sur votre IDE sans d'abord déployer les modifications que vous avez apportées au GAC de Common avec le type Common.ClassB nouvellement ajouté.

Dumisa
la source
1

J'ai eu la même erreur après la mise à jour d'une dll référencée dans un projet exécutable de bureau. Le problème était, comme les gens l'ont mentionné ici, lié à une ancienne référence et simple à corriger, mais n'a pas été mentionné ici, alors j'ai pensé que cela pourrait faire gagner du temps à d'autres personnes.

Quoi qu'il en soit, j'ai mis à jour la dll A et obtenu l'erreur d'une autre dll référencée, appelons-la B ici où dll A a une référence à la dll B.

La mise à jour de la DLL B a résolu le problème.

Hamid Heydarian
la source
1

Ajout de votre DLL au GAC (Global Assembly Cache)

Invite de commandes Visual Studio => Exécuter en tant qu'administrateur

gacutil / i "chemin du fichier dll"

Vous pouvez voir l'assemblage ajouté C: \ Windows \ system32 \

Cela résoudra également les dll manquantes ou "Impossible de charger le fichier ou l'assembly" dans la tâche de script SSIS

Ezhil Arasan
la source
1
Je noterai que l'ajout d'éléments au GAC est généralement une mauvaise idée, rend le déploiement plus difficile et est généralement quelque chose que même Microsoft recule.
George Mauer
1

J'ai rencontré un problème similaire dans Visual Studio 2017 en utilisant MSTest comme cadre de test. Je recevais des exceptions System.TypeLoadException lors de l'exécution de certains (pas tous) tests unitaires, mais ces tests unitaires passaient lors du débogage. J'ai finalement fait ce qui suit qui a résolu le problème:

  1. Ouvrez le fichier Local.testsettings dans la solution
  2. Accédez aux paramètres "Test unitaire"
  3. Décochez la case «Utiliser le contexte de chargement pour les assemblys dans le répertoire de test». case à cocher

Après avoir suivi ces étapes, tous les tests unitaires ont commencé à réussir lors de leur exécution.

Chris
la source
1

J'ai vécu la même chose que ci-dessus après avoir supprimé la signature des assemblages dans la solution. Les projets ne se construiraient pas.

J'ai trouvé que l'un des projets faisait référence au package NuGet StrongNamer, qui modifie le processus de construction et tente de signer des packages Nuget non signés.

Après avoir supprimé le package StrongNamer, j'ai pu reconstruire le projet sans signer / nommer fort les assemblys.

Larsbj
la source
0

S'il s'agit d'une application Windows, essayez de rechercher un doublon dans le Global Assembly Cache (GAC). Quelque chose remplace votre version bin / debug.

S'il s'agit d'une application Web, vous devrez peut-être supprimer sur le serveur et retélécharger. Si vous publiez, vous pouvez cocher la case Supprimer tous les fichiers existants avant la publication. Selon la version de Visual Studio, il doit être situé dans Publier> Paramètres> Options de publication de fichier Supprimer tous les fichiers existants avant de publier

Jeff
la source
-2

Je viens de résoudre ce problème en exécutant la commande iisreset à l'aide de l'invite de commande ... Toujours la première chose que je fais lorsque j'obtiens de telles erreurs.

Bas Wiebing
la source
4
Je suis désolé mais cela n'a rien à voir avec la question, fait des hypothèses sur l'utilisation d'iis et n'explique pas ce qui cause le problème.
George Mauer