web-dev-qa-db-fra.com

Strange Error - CS0012: Le type x est défini dans un assembly non référencé.

Le type 'x' est défini dans un assemblage non référencé. Vous devez ajouter une référence à Assembly 'abc123'.

J'ai une application Web .NET 2.0 qui fait référence à mon assemblage 'abc123'. L'Assemblée existe dans le GAC et j'ai vérifié qu'il s'agissait de la version correcte (identique). Le reste de l'application n'a pas de problèmes, sauf pour une page .aspx. La page en question a un répéteur qui affiche un contrôle utilisateur comme l'un de ses "champs". En reliant une liste de type y au répéteur, je passe au contrôle utilisateur une liste de type x (une propriété de y) comme indiqué ici:

<uc1:usercontrol id="ucusercontrol " runat="server" myPublicUserControlProperty='<%#Eval("CollectionOfX") %>'/>

Dans le jeu de propriétés du contrôle utilisateur, je lie la liste de type x à un gridview dans le contrôle utilisateur.

Une chose étrange à noter est que ce rapport fonctionne bien sur mon PC de développement, mais pas sur les serveurs une fois que je déploie. Mon ordinateur est Windows XP, IIS6, VS2005. Les serveurs sont Windows Server 2003, IIS6.

J'espère que j'ai bien expliqué cela. Merci d'avance pour toute idée que vous pouvez fournir.

29
Mike T

Je suis le collègue de Mike et nous avons trouvé une solution.

Le type X est défini dans son assemblée, c'est-à-dire uniquement dans le GAC. Même si son application Web ASP.NET avait une référence, il ne pouvait pas être chargé à partir du GAC uniquement pour ce contrôle UserControl. Le reste de l'application a fonctionné comme prévu. Nous avons confirmé l'échec du chargement en plaçant une copie de l'Assemblée dans le répertoire bin, et tout a fonctionné. Nous avons retiré l’Assemblée et le problème est revenu. 

Notre solution consistait à ajouter manuellement une entrée au fichier web.config dans la section des assemblées afin de faire pointer ASP.NET vers le GAC. 

Cela ressemble à chaque fois que vous référencez un type dans la page (pas le code-behind), vous avez besoin des informations d'assembly définies dans le fichier web.config ou dans une directive de page.

<assemblies>
        <add Assembly="MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=[MyPublicKeyToken]"/>   
</assemblies>
28
Aaron Daniels

Il y a aussi un bug qui peut se manifester avec des symptômes similaires, décrit ici .

La solution de contournement consiste à supprimer tout ce qui se trouve dans le répertoire Fichiers ASP.NET\C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary.

4
Tom Lianza

Lors du dépannage de ce type de problèmes, le Fusion Log Viewer a toujours été d'une grande aide.

3
Maxam

J'ai constaté que si type x est en fait une classe de votre App_Code, le salir puis le réenregistrer, oblige souvent l'application Web à recompiler et à résoudre le problème.

1
Charbarred

J'ai eu exactement la même erreur, mais j'avais un constructeur public dans ma classe qui utilisait comme paramètre un objet d'un autre projet.

J'ai résolu le problème en rendant ce constructeur interne.

0
Dan

Le plus souvent, c'est à cause des assemblys mis en cache. Une façon de résoudre ce problème consiste à définir la "référence forte" dans le fichier proj ou config. Référer ce blog post

0
Lav G

Pour moi, c'était un problème de contrôle de version. 

Dans Visual studio, ouvrez "Références" dans votre Explorateur de solutions et faites-le défiler. 

Si quelque chose porte un triangle d’avertissement jaune, rappelez-vous le nom, supprimez-le et rajoutez-le (ou demandez à ReSharper de le faire pour vous). 

Cela m'est arrivé plusieurs fois après avoir tiré un projet lorsqu'un collègue a ajouté un nouveau package et des références.

0
Max Izrin