web-dev-qa-db-fra.com

Le type est défini dans un assembly qui n'est pas référencé. Comment trouver la cause?

Je sais que le message d'erreur est commun et qu'il y a beaucoup de questions sur SO à propos de cette erreur, mais aucune solution ne m'a aidé jusqu'à présent, alors j'ai décidé de poser la question. La différence avec la plupart des questions similaires est l'utilisation du répertoire App_Code.

Message d'erreur:

CS0012: The type 'Project.Rights.OperationsProvider' is defined in an
Assembly that is not referenced. You must add a reference to Assembly
'Project.Rights, version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Fichier source:

c:\inetpub\wwwroot\Test\Website\App_Code\Company\Project\BusinessLogic\Manager.cs

Après suggestions ici et ici , j’ai supprimé toutes les instances de Project.Rights.dll dans C:\Windows\Microsoft.NET /*.* Selon this , I vérifié si l'action de construction des fichiers .cs en question est définie sur "Compiler". Ils font . J'ai également vérifié deux fois que le fichier .cs contenant le type "Project.Rights.OperationsProvider" est déployé dans le répertoire App_Code.

Pour une raison quelconque, l'application ne recherche pas le type dans le répertoire App_Code. Depuis que j'ai supprimé toutes les instances de Project.Rights.dll (que je sache), je ne sais pas quel assembly le message d'erreur mentionne.

60
afaf12

Lorsque vous obtenez cette erreur, il n’est pas toujours évident de savoir ce qui se passe, mais comme le dit l’erreur, il vous manque une référence. Prenez la ligne de code suivante à titre d'exemple:

MyObjectType a = new MyObjectType("parameter");

Cela semble assez simple et vous avez probablement déjà référencé "MyObjectType" correctement. Mais disons que l'une des surcharges du constructeur "MyObjectType" prend un type que vous n'avez pas référencé. Par exemple, il existe une surcharge définie comme suit:

public MyObjectType(TypeFromOtherAssembly parameter) {
    // ... normal constructor code ...
}

C'est au moins un cas où vous obtiendrez cette erreur. Recherchez donc ce type de modèle dans lequel vous avez référencé le type, mais pas tous les types de propriétés ou de paramètres de méthode possibles pour les fonctions appelées sur ce type.

J'espère que cela vous permet au moins d'aller dans la bonne direction!

75
drew_w

Vérifier le cadre cible dans les projets.

Dans mon cas, "vous devez ajouter une référence à Assembly" signifiait en fait que les projets appelant et référence n'avaient pas le même cadre cible. Le projet appelant avait .Net 4.5, mais la bibliothèque référencée avait la cible 4.6.1. 

Je suis sûr que le compilateur MS peut être plus intelligent et enregistrer un message d'erreur plus significatif. J'ai ajouté une suggestion à https://github.com/dotnet/roslyn/issues/14756

36
Michael Freidgeim

Dans mon cas, cela était dû au fait que la mise à jour du paquet NuGet ne faisait que mettre à jour les références à une dépendance de la DLL dans des projets mais pas tous de ma solution, ce qui a entraîné des versions conflictuelles. En utilisant un outil de style grep pour rechercher du texte dans des fichiers * .csproj dans ma solution, il était alors facile de voir les projets qui devaient encore être mis à jour.

13
rogersillito

Lorsque vous obtenez cette erreur, cela signifie que le code que vous utilisez fait référence à un type qui se trouve dans un assembly, mais l'assembly ne faisant pas partie de votre projet, il ne peut donc pas l'utiliser.

Supprimer Project.Rights.dll est le contraire de ce que vous voulez. Vous devez vous assurer que votre projet peut référencer l'Assemblée. Il doit donc être placé dans le Global Assembly Cache ou dans le répertoire ~/Bin de votre application Web.

Edit-Si vous ne souhaitez pas utiliser l’Assembly, sa suppression n’est pas non plus la solution. Au lieu de cela, vous devez supprimer toutes les références à ce code dans votre code. Puisque le code que vous avez écrit n'a pas directement besoin de Assembly, mais que vous faites référence à quelque chose que vous référencez, vous devrez remplacer cet Assembly référencé par quelque chose dont Project.Rights.dll n'est pas une dépendance.

7
mason

Il m'est simplement arrivé que différents projets référencent différentes copies de la même DLL . Je me suis assuré que tous référencaient le même fichier sur le disque et que l'erreur disparaissait comme prévu.

3
Gonzalo Méndez

Dans mon cas, je faisais référence à une bibliothèque qui était construite sur la mauvaise plate-forme/configuration (je venais de créer la bibliothèque référencée).

De plus, je ne pouvais pas résoudre le problème dans Visual Studio Configuration Manager - impossible de basculer et de créer de nouvelles plates-formes et configurations pour cette bibliothèque. Je l'ai corrigé en corrigeant les entrées de la section ProjectConfigurationPlatforms du fichier .sln pour ce projet. Toutes ses permutations ont été définies sur Debug|Any CPU (je ne suis pas sûr de savoir comment je l'ai fait). J'ai écrasé les entrées du projet endommagé par celles d'un projet actif et modifié le GUID pour chaque entrée.

Entrées pour le projet en cours

{9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.ActiveCfg = Release|x64 {9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.Build.0 = Release|x64

Entrées pour projet corrompu

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Debug|Any CPU {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Debug|Any CPU

Entrées corrompues maintenant corrigées

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Release|x64 {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Release|x64

J'espère que ça aidera quelqu'un.

3
Joseph

Cela ne fonctionnait pas pour moi lorsque j'ai essayé d'ajouter la référence à partir de l'onglet Assemblys .NET . Cela fonctionnait cependant lorsque j'ai ajouté la référence avec BROWSE à C:\Windows\Microsoft. NET\Framework\v4.0.30319

1
Cătălin Rădoi

Pour moi, l'erreur est apparue parce que le formulaire Web où l'erreur a été signalée a été déplacé d'un autre dossier, mais le nom de sa classe codefile est resté inchangé et ne correspond pas au chemin d'accès réel. 

Etat initial:
Chemin du fichier d'origine: /Folder1/Subfolder1/MyWebForm.aspx.cs
Nom de classe du fichier de code d'origine:Folder1_Subfolder1_MyWebForm

Après le déplacement du fichier:
Chemin du fichier: /Folder1/MyWebForm.aspx.cs
Nom de la classe de fichier de code (inchangé, avec l'erreur affichée):Folder1_Subfolder1_MyWebForm

La solution:
Renommer votre classe de fichier de code Folder1_Subfolder1_MyWebForm
to one correspondant avec le nouveau chemin : Folder1_MyWebForm

Tout à la fois - problème résolu, aucune erreur rapportée ..

0
Vladimír Hála

Pour moi, cela a été causé par le projet à la fois directement et indirectement (via une autre dépendance) faisant référence à deux versions différentes de Bouncy Castle ayant des noms d'assemblés différents. L'une des versions de Bouncy Castle était le paquet NuGet, l'autre était une version de débogage de la source téléchargée depuis GitHub. Les deux versions étaient nominalement version 1.8.1, mais les paramètres du projet du code GitHub définissaient le nom de l’assembly sur BouncyCastle, tandis que le package NuGet portait le nom de l’assembly BouncyCastle.Crypto. La modification des paramètres du projet, alignant ainsi les noms des assemblages, a résolu le problème. 

0
mathiash

Dans mon cas, c’est parce que j’ai utilisé 

Opérateur implicite

entre BLL et DAL classes.lorsque je veux utiliser BLL Layer dans la couche application, j'ai cette erreur ..__ 

opérateur implicite

à 

opérateur explicite

ça va aller ... Merci

0

J'ai un problème similaire et je supprime RuntimeFrameworkVersion et le problème a été corrigé.

Essayez de supprimer 1.1.1 ou

0
Arash

Dans mon cas, la version de la DLL référencée était en réalité plus récente que celle que j'avais auparavant. 

Je devais simplement revenir à la version précédente et le corriger. 

0
Hugo Nava Kopp

Cela peut également signifier que vous utilisez une bibliothèque, qui expose les types (publics) définis dans une bibliothèque. Même lorsque vous ne les utilisez pas spécifiquement dans votre bibliothèque (celui qui ne construit pas).

Ce que cela empêche probablement, c’est que vous écrivez du code qui utilise une classe (dans sa signature, les types d’une bibliothèque non référencée) que vous ne pouvez pas utiliser.

0
cr4ne

Peut-être qu'une bibliothèque (fichier DLL) que vous utilisez nécessite une autre bibliothèque. Dans mon cas, j'ai référencé une bibliothèque contenant un modèle d'entité de base de données, mais j'ai oublié de faire référence à la bibliothèque de structures d'entités.

0
Graham Laight

Le type 'Domain.tblUser' est défini dans un assembly qui n'est pas référencé. Vous devez ajouter une référence au domaine de l'assembly, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null '.

**Solved:**
 Add reference of my domain library layer to my web app libary layer

Remarque: assurez-vous que vos références sont correctes en fonction de votre conteneur DI

0
Asif Raza

une des raisons principales peut être la propriété de DLL vous devez avant tout vérifier lespecific version propertys'il est vrai, le rendre faux 

Raison: peut-être que le code source est associé à une autre version (ancienne) lorsque vous le construisez, mais cette bibliothèque a été mise à niveau avec une nouvelle mise à jour, la version est maintenant différente dans Assembly Cash et votre application n’est pas autorisée à obtenir le nouveau DLL, et après avoir désactivéspecific version propertyvotre applacaten sera libre d’obtenir la nouvelle version de DLL références 

0