Der Typ wird in einer Assembly definiert, auf die nicht verwiesen wird. Wie kann die Ursache ermittelt werden?

83

Ich weiß, dass die Fehlermeldung häufig vorkommt und es gibt viele Fragen zu SO zu diesem Fehler, aber bisher haben mir keine Lösungen geholfen. Deshalb habe ich beschlossen, die Frage zu stellen. Der Unterschied zu den meisten ähnlichen Fragen besteht darin, dass ich das Verzeichnis App_Code verwende.

Fehlermeldung:

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'.

Quelldatei:

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

Folgende Vorschläge hier und hier habe ich alle Instanzen Project.Rights.dll innen C gelöscht: \ Windows \ Microsoft.NET /*.* Nach diesem , überprüfte ich , wenn CS - Dateien in diesem Build Aktion auf „Compile“ . Tun sie. Ich habe außerdem überprüft, ob die CS-Datei mit dem Typ "Project.Rights.OperationsProvider" im Verzeichnis App_Code bereitgestellt wird.

Aus irgendeinem Grund sucht die Anwendung nicht nach dem Typ im Verzeichnis App_Code. Da ich alle mir bekannten Instanzen von Project.Rights.dll gelöscht habe, weiß ich nicht, welche Assembly in der Fehlermeldung erwähnt wird.

afaf12
quelle
6
Sie verwenden eine Klasse (sagen wir A ), die eine Methode / Eigenschaft / etwas vom Typ Project.Rights.OperationsProvider verfügbar macht. Der Compiler muss wissen, was das ist, dann durchsucht er diese Assembly (Project.Rights). Wenn es nicht gefunden wird (weil Sie in Ihrem Website-Projekt keinen Verweis darauf haben) ... wird dieser Fehler angezeigt. Lösung: Entfernen Sie diese Baugruppe NICHT von Ihrem System !!! Fügen Sie einen Verweis darauf hinzu.
Adriano Repetti
2
Gehen Sie zu Tools - Optionen - Projekte und Lösungen - Erstellen und Ausführen - setzen Sie beide Ausführlichkeiten auf Detailliert. Das wird Ihnen sagen, was die Abhängigkeit ist und wo der Compiler danach sucht.
Danludwig

Antworten:

99

Wenn Sie diesen Fehler erhalten, ist es nicht immer offensichtlich, was los ist, aber wie der Fehler sagt, fehlt Ihnen eine Referenz. Nehmen Sie als Beispiel die folgende Codezeile:

MyObjectType a = new MyObjectType("parameter");

Es sieht einfach aus und Sie haben wahrscheinlich "MyObjectType" korrekt referenziert. Angenommen, eine der Überladungen für den Konstruktor "MyObjectType" verwendet einen Typ, auf den Sie nicht verwiesen haben. Zum Beispiel gibt es eine Überlastung definiert als:

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

Dies ist mindestens ein Fall, in dem Sie diesen Fehler erhalten. Suchen Sie also nach diesem Mustertyp, bei dem Sie auf den Typ verwiesen haben, jedoch nicht auf alle Typen der Eigenschaften oder Methodenparameter, die für Funktionen möglich sind, die für diesen Typ aufgerufen werden.

Hoffentlich bringt dich das zumindest in die richtige Richtung!

zog_w
quelle
16
Hinweis zu Erweiterungsmethoden: Wenn zwei Klassen Erweiterungsmethoden mit demselben Namen haben, können Parameter eines Typs die Verwendung der Erweiterungsmethode eines anderen Typs "infizieren".
Athari
@ Athari danke, ich hätte das nie herausgefunden
Dave Cousineau
Nur zufällig auf diese Antwort nach einer Weile des Schauens. Dies ist genau mein Problem und Ihre Erklärung war sehr hilfreich. Vielen Dank.
Diane
1
Aber was ist, wenn ich den Konstruktor nicht mit der Referenz verwenden möchte? Ich möchte die anderen verwenden, ohne eine Referenz hinzuzufügen. Es scheint, dass dies möglich sein sollte.
Robert Iagar
1
Das scheint wirklich seltsam, aber ich habe diesen Fehler erhalten, weil ich bei einem der Assembly-Namen eine Nichtübereinstimmung hatte (sieht so aus, als ob Nuget zwischen Groß- und Kleinschreibung unterscheidet?)! Ich hatte eine Bibliothek C Referenzbibliotheken B und A. Bibliothek B verwies auch auf Bibliothek A, packte A jedoch als Abhängigkeit mit dem Namen 'a' anstelle von 'A'. Beim Erstellen der Bibliothek C wurde dieser Fehler so lange angezeigt, bis ich den Namen der Abhängigkeit in B korrigiert habe!
Tolu
49

Überprüfen Sie das Ziel-Framework in den Projekten.

In meinem Fall bedeutete "Sie müssen einen Verweis auf Assembly hinzufügen" tatsächlich, dass Aufrufer- und Referenzprojekte nicht dasselbe Zielframework hatten. Das Aufruferprojekt hatte .Net 4.5, aber die referenzierte Bibliothek hatte das Ziel 4.6.1.

Ich bin sicher, dass der MS-Compiler intelligenter sein und aussagekräftigere Fehlermeldungen protokollieren kann. Ich habe https://github.com/dotnet/roslyn/issues/14756 einen Vorschlag hinzugefügt

Michael Freidgeim
quelle
16

In meinem Fall lag dies daran, dass bei einem NuGet-Paket-Update nur Verweise auf eine DLL-Abhängigkeit in einigen, aber nicht allen Projekten in meiner Lösung aktualisiert wurden, was zu widersprüchlichen Versionen führte. Mit einem Grep-Tool zum Durchsuchen von Text in * .csproj-Dateien in meiner Lösung war es dann einfach, die Projekte zu erkennen, die noch aktualisiert werden mussten.

Rogersillito
quelle
Vielen Dank für diese Antwort - ich dachte, es wäre etwas in der Nähe, war aber froh, es zu sehen. Anders ausgedrückt: Bei meinem übergeordneten Projekt (Dienst), das einen Konstruktor mit einem optionalen Parameter in meiner Datenschicht aufruft, wurde diese Referenz nicht zur .csproj hinzugefügt. Beim Vergleichen der untergeordneten und übergeordneten .csproj-Dateien sollte eine ItemGroup beleuchtet werden, die sich in der übergeordneten Datei befinden sollte, die dies nicht ist.
Ryanman
3
Das Visual Studio Package Manager-Fenster für die Lösung (nicht für einzelne Projekte) verfügt über die Registerkarte Konsolidieren, auf der angezeigt wird, welche Pakete in verschiedenen Projekten unterschiedliche Versionen haben. Es ist nachweislich besser als ein Grep-ähnliches Tool
Michael Freidgeim
7

Wenn Sie diesen Fehler erhalten, bedeutet dies, dass der von Ihnen verwendete Code auf einen Typ verweist, der sich in einer Assembly befindet, die Assembly jedoch nicht Teil Ihres Projekts ist und daher nicht verwendet werden kann.

Das Löschen von Project.Rights.dll ist das Gegenteil von dem, was Sie wollen. Sie müssen sicherstellen, dass Ihr Projekt auf die Baugruppe verweisen kann. Es muss also entweder im Global Assembly Cache oder im Verzeichnis ~ / Bin Ihrer Webanwendung abgelegt werden.

Bearbeiten - Wenn Sie die Assembly nicht verwenden möchten, ist das Löschen ebenfalls nicht die richtige Lösung. Stattdessen müssen Sie alle Verweise darauf in Ihrem Code entfernen. Da die Assembly nicht direkt von dem von Ihnen geschriebenen Code benötigt wird, sondern von etwas anderem, auf das Sie verweisen, müssen Sie diese Assembly, auf die verwiesen wird, durch etwas ersetzen, das keine Project.Rights.dll als Abhängigkeit enthält.

Mason
quelle
2
Ich kann die Baugruppe nicht verwenden, das ist eine Voraussetzung. Ich muss es loswerden und die Klasse im Verzeichnis App_Code speichern. Ich weiß, wie es sich anhört, glauben Sie mir. Es macht keinen Spaß, eine Anwendung so zu ändern, dass die gesamte Geschäftslogik in App_Code anstelle von DLLs gespeichert wird.
afaf12
1
Nein, es bedeutet, dass er etwas mit einem Verweis darauf verwendet (nicht, dass er direkt verwendet). @ afaf12 Wenn Sie es loswerden müssen ... müssen Sie überprüfen, wer es verwendet (stellen Sie sich dies als indirekte Referenz vor). Sie können nicht einfach Code in das App_Code-Verzeichnis einfügen, jede kompilierte Assembly verweist weiterhin auf die ursprüngliche (und externe) ...
Adriano Repetti
Ich hatte eine ähnliche und Ihr Beitrag hat mir sehr geholfen. In meinem Fall hatte ich eine Baugruppe "A" referenziert. Diese Baugruppe verwendete eine andere Baugruppe "B". Ich habe immer wieder die Fehlermeldung erhalten, dass die Baugruppe "B" fehlt, obwohl ich sie meinem Projekt hinzugefügt habe. Nachdem ich die Baugruppe "B" in mein bin-Verzeichnis kopiert hatte, war das Problem behoben. Der Grund ist, dass mein Projekt nicht die Assembly "B" verwendet hat, sondern die Assembly "A" und sie nicht gefunden hat und daher eine Ausnahme auslöst. Vielen Dank.
YKH
4

In meinem Fall habe ich auf eine Bibliothek verwiesen, die auf der falschen Plattform / Konfiguration erstellt wurde (ich hatte gerade die referenzierte Bibliothek erstellt).

Außerdem konnte ich das Problem in Visual Studio Configuration Manager nicht beheben - ich konnte nicht wechseln und neue Plattformen und Konfigurationen für diese Bibliothek erstellen. Ich habe es behoben, indem ich die Einträge im ProjectConfigurationPlatformsAbschnitt der .slnDatei für dieses Projekt korrigiert habe . Alle seine Permutationen wurden eingestellt Debug|Any CPU(ich bin nicht sicher, wie ich das gemacht habe). Ich habe die Einträge für das fehlerhafte Projekt mit denen für ein funktionierendes Projekt überschrieben und die GUID für jeden Eintrag geändert.

Einträge für ein funktionierendes Projekt

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

Einträge für beschädigtes Projekt

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

Beschädigte Einträge jetzt behoben

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

Ich hoffe das hilft jemandem.

Joseph
quelle
Für mich war es ähnlich. VIsual Studio hat die GUIDs für einige meiner Projekte von FAE04EC0-301F-11D3-BF4B-00C04F79EFBC(C #) in 9A19103F-16F7-4668-BE54-9A1E7A4F7556(ASP.NET) geändert . Nachdem ich sie wieder gewechselt hatte, lief alles gut.
Scor4er
3

Mir ist gerade passiert, dass verschiedene Projekte auf verschiedene Kopien derselben DLL verweisen. Ich habe sichergestellt, dass alle auf dieselbe Datei auf der Festplatte verweisen, und der Fehler ist wie erwartet verschwunden.

Gonzalo Méndez
quelle
1

Es hat bei mir nicht funktioniert, als ich versucht habe, die Referenz von der Registerkarte .NET Assemblies hinzuzufügen. Es hat jedoch funktioniert, als ich den Verweis mit BROWSE zu C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 hinzugefügt habe

Cătălin Rădoi
quelle
0

Einer der Hauptgründe kann die Eigenschaft der DLL sein, die Sie benötigen, bevor Sie etwas tun, um die zu überprüfen specific version property ob sie wahr und falsch ist

Grund: Möglicherweise wurde der Quellcode beim Erstellen mit einer anderen (alten) Version specific version propertyverknüpft , aber diese Bibliothek wurde mit einem neuen Update aktualisiert. Die Version unterscheidet sich jetzt in Assembly Cash, und Ihre Anwendung darf keine neue DLL erhalten. Nach dem Deaktivieren ist Ihre Anwendung kostenlos um die neue Version von DLL-Referenzen zu erhalten

Mohammed Rashed Ali
quelle
0

Möglicherweise erfordert eine von Ihnen verwendete Bibliothek (DLL-Datei) eine andere Bibliothek. In meinem Fall habe ich auf eine Bibliothek verwiesen, die ein Datenbankentitätsmodell enthielt - aber ich habe vergessen, auf die Entitätsframeworkbibliothek zu verweisen.

Graham Laight
quelle
0

Dies kann auch bedeuten, dass Sie eine Bibliothek verwenden, die (öffentliche) Typen verfügbar macht, die in einer Bibliothek definiert sind. Auch wenn Sie diese nicht speziell in Ihrer Bibliothek verwenden (die nicht erstellt wird).

Dies verhindert wahrscheinlich, dass Sie Code schreiben, der eine Klasse verwendet (deren Signatur die Typen aus einer Bibliothek enthält, auf die nicht verwiesen wird), die Sie nicht verwenden können.

Aage
quelle
0

Für mich war der Grund, warum der Fehler auftrat, dass die WebForm, in der der Fehler gemeldet wurde, aus einem anderen Ordner verschoben wurde, der Name der Codedateiklasse jedoch unverändert blieb und nicht dem tatsächlichen Pfad entsprach.

Ausgangszustand:
Ursprünglicher Dateipfad: /Folder1/Subfolder1/MyWebForm.aspx.cs
Name der ursprünglichen Codedateiklasse: Folder1_Subfolder1_MyWebForm

Nachdem die Datei verschoben wurde:
Dateipfad: /Folder1/MyWebForm.aspx.cs
Name der Codefile-Klasse (unverändert, mit dem angezeigten Fehler): Folder1_Subfolder1_MyWebForm

Die Lösung:
Benennen Sie Ihre Codefile - Klasse Folder1_Subfolder1_MyWebForm
zu einem entsprechenden mit dem neuen Weg :Folder1_MyWebForm

Auf einmal - Problem gelöst, keine Fehlermeldung ..

Vladimír Hála
quelle
0

Der Typ 'Domain.tblUser' wird in einer Assembly definiert, auf die nicht verwiesen wird. Sie müssen einen Verweis auf die Assembly 'Domain, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' hinzufügen.

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

Hinweis: Stellen Sie sicher, dass Ihre Referenzen gemäß Ihrem DI-Container korrekt sind

Asif Raza
quelle
0

In meinem Fall war das, weil ich verwendet habe

Impliziter Operator

zwischen BLLund DALKlassen. Wenn ich BLLLayer In Application Layer verwenden möchte, wurde dieser Fehler angezeigt . ich habe mich verändert

impliziter Operator

zu

expliziter Operator

es ist in Ordnung. Vielen Dank

Amirhossein Yari
quelle
0

In meinem Fall war die Version der referenzierten DLL tatsächlich neuer als die, die ich zuvor hatte.

Ich musste nur auf die vorherige Version zurücksetzen und das hat es behoben.

Hugo Nava Kopp
quelle
0

Für mich wurde dies durch das Projekt verursacht, das sowohl direkt als auch indirekt (durch eine andere Abhängigkeit) auf zwei verschiedene Gebäude von Bouncy Castle verwies, die unterschiedliche Versammlungsnamen hatten. Einer der Bouncy Castle-Builds war das NuGet-Paket, der andere war ein Debug-Build der von GitHub heruntergeladenen Quelle. Beide waren nominell Version 1.8.1, aber die Projekteinstellungen des GitHub-Codes setzten den Assemblynamen auf BouncyCastle, während das NuGet-Paket den Assemblynamen BouncyCastle.Crypto hatte. Durch Ändern der Projekteinstellungen und damit Ausrichten der Baugruppennamen wurde das Problem behoben.

Mathiash
quelle
1
Ich schlage vor, Sie können Ihre Antwort hilfreicher gestalten, indem Sie auch erklären, wie Sie sie behoben haben.
Stephen Kennedy
0

Ich habe ein ähnliches Problem und entferne die RuntimeFrameworkVersion. Das Problem wurde behoben.

Versuchen Sie, 1.1.1 oder zu entfernen

Arash Yazdani
quelle
0

Ich hatte dieses Problem mit einer neu erstellten Lösung, die vorhandene Projekte verwendete. Aus irgendeinem Grund konnte ein Projekt kein anderes Projekt "sehen", obwohl es dieselbe Referenz wie jedes andere Projekt hatte und das referenzierte Projekt ebenfalls erstellt wurde. Ich vermute, dass es nicht erkannt wurde, was mit mehreren Ziel-Frameworks zu tun hat, weil es in einem Framework aufgebaut war, aber nicht im anderen.

Das Bereinigen und Wiederherstellen hat nicht funktioniert, und das Neustarten von VS hat nicht funktioniert.

Am Ende wurde eine "Developer Command Prompt for VS 2019" geöffnet und anschließend ein msbuild MySolution.slnBefehl ausgegeben . Dies wurde erfolgreich abgeschlossen und danach begann VS auch erfolgreich zu bauen.

Dave Cousineau
quelle
-3

Bereinigen Sie Ihre Lösung und die Neuerstellung hat für mich funktioniert (in Visual Studio sind dies Optionen, die Sie erhalten, wenn Sie mit der rechten Maustaste in Ihren Lösungs-Explorer klicken). Der Fehler ist in meinem Projekt verschwunden.

Joost
quelle