137 votes

Erreur : Impossible de charger le type d'assemblage

J'ai écrit le test simple suivant en essayant d'apprendre l'interface fluide 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 à travers le NUnit GUI, 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 les suivantes :

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

et qu'il contient certainement Castle.MicroKernel.Registration.IRegistration

Qu'est-ce qui peut bien se passer ?

Je dois préciser que les binaires sont tirés de l'application dernière version de Castle Bien que je n'aie jamais travaillé avec nant, 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.

140voto

AndrewS Points 1841

Si un projet fait référence à un autre projet (comme une application Windows faisant référence à une bibliothèque de classes) et que les deux ont le même nom d'assemblage, vous obtiendrez cette erreur. Vous pouvez soit donner un nom fort au projet référencé, soit (encore mieux) renommer l'assemblage du projet référencé (sous l'onglet "Application" des propriétés du projet dans VS).

2 votes

De plus, essayez de nettoyer le dossier de sortie. Il est probable qu'un renommage de bibliothèque puisse causer le même problème, car les deux (ancien et nouveau) seront placés dans le même dossier de sortie.

0 votes

Si vous faites un copier-coller d'un projet et que vous ne modifiez pas correctement tous les champs, cela peut conduire à ce problème !

1 votes

Cela a été le cas pour moi, j'avais déjà référencé l'Assemblée dans la bibliothèque de classe 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 paquet dans nuGet pour que cela fonctionne.

118voto

spoon16 Points 17694

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

1 votes

J'ai ajouté les assemblages en naviguant vers les fichiers dll, donc le GAC ne devrait pas entrer dans l'équation. De plus, un clic droit sur l'assemblage->ouvrir dans le réflecteur à partir de l'explorateur de solutions le fait apparaître dans le réflecteur avec toutes les informations que j'attendais.

7 votes

Peu importe comment vous l'avez ajouté, si un assemblage avec le même nom/version existe dans le GAC, il chargera celui-là.

1 votes

VS.NET affichera le chemin d'accès à l'assemblage que vous sélectionnez et le réflecteur ouvrira le bon assemblage, mais lorsque l'application s'exécutera, le moteur d'exécution .NET chargera l'assemblage du GAC.

16voto

bmoeskau Points 13136

La solution à ce problème pour moi n'a pas été mentionnée ci-dessus, alors j'ai pensé ajouter ma réponse à la longue traîne...

J'ai fini par avoir une ancienne référence à une classe (une HttpHandler ) dans web.config qui n'était plus utilisée (et n'était plus une référence valide). Pour une raison quelconque, elle était ignorée 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 vers IIS. J'ai fait une recherche sur le nom de l'assemblage dans web.config, j'ai supprimé la référence au handler inutilisé, puis cette erreur a disparu et tout fonctionne parfaitement. J'espère que cela aidera quelqu'un d'autre.

1 votes

J'ai eu quelque chose de très similaire, la seule différence étant 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, ce qui a provoqué l'exception.

11voto

Matt Wolf Points 1350

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

Mais comme plusieurs utilisateurs l'ont suggéré, il s'agissait d'un ancien assemblage toujours référencé.

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

0 votes

Cela a marché pour moi. Merci !

8voto

Michael Maddox Points 7345

J'obtenais cette erreur et rien de ce que j'ai trouvé sur StackOverflow ou ailleurs ne l'a résolue, 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 originale, mais je la poste ici en supposant que quelqu'un ayant ce problème trouvera le chemin ici en faisant une recherche sur Google ou quelque chose de similaire (comme moi dans un mois quand cela me piquera à nouveau, arg !).

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

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