Mein C # -Projekt - wir nennen es die SuperUI - wurde verwendet, um eine Klasse aus einer externen Assembly zu verwenden. Jetzt ist es nicht, aber der Compiler lässt mich das Projekt nicht ohne die Assemblyreferenz erstellen. Lass mich das ausarbeiten.
In diesem Projekt wurde eine benutzerdefinierte Ausnahmeklasse - die SuperException
- geworfen und abgefangen, die von der standardmäßigen System.Exception abgeleitet wurde und in einer separaten vorkompilierten Assembly namens SuperAssembly.DLL
verwendet wurde, auf die ich verwiesen habe.
Schließlich entschied ich, dass dies eine sinnlose Übung war und ersetzte alle SuperExceptions
durch eine System.SuitableStandardException in jedem Fall. Ich habe den Verweis auf SuperException.DLL
entfernt, bin aber jetzt auf Folgendes gestoßen, wenn ich versuche, das Projekt zu kompilieren:
Der Typ 'SuperException' ist in einer Assembly definiert, auf die nicht verwiesen wird. Sie müssen einen Verweis auf die Assembly 'SuperException, Version = 1.1.0.0 (...)'
hinzufügen
Die Quelldatei, auf die der Fehler verweist, scheint nicht relevant zu sein. es ist der Projektnamensraum, der in der IDE hervorgehoben wird.
Nun, hier ist das Ding:
SuperException
wurden aus dem Projektcode entfernt. SuperException.DLL
kompiliert, referenziere ich nur eine weitere Assembly - und that
verweist auf nichts, das mein Projekt nicht selbst referenziert. Während es möglich ist, dass jede dieser Abhängigkeiten SuperExceptions
auslösen kann, erhalte ich nur die Basis-Exception-Klasse und in jedem Fall ... das andere Projekt baut sich gut auf! Es ist nicht das Ende der Welt, diese Referenz aufzunehmen, ich sehe einfach nicht, warum es mehr nötig ist. Nrrrgg. Alle Hinweise willkommen!
Wahrscheinlich handelt es sich um eine transitive Referenz, bei der ein Aufruf der Typmethode eine Instanz der SuperException-Box zurückgibt ("downcast"), z. Ausnahme, aber durch die Überprüfung des Codes im Code mit transitivem Code, d. H. Code aus Ihren externen Methodenaufrufen, weiß der Compiler, dass Sie zu einem bestimmten Zeitpunkt Informationen über diesen Typ haben müssen.
Resharper würde Ihnen sagen, wo Sie eine Referenz hinzufügen müssen, und Sie könnten Lütz Roeders aka RedGate's Reflector verwenden, um kompilierte IL für eine Referenz zu diesem Typ auf zwei Arten zu scannen: 1) benutzen Sie die Suchfunktion, 2) öffne jeden öffentlichen Typ den du benutzt und für den, der die "Geister" Assembly benötigt, wirst du aufgefordert den Ort anzugeben.
Das passiert mir am häufigsten, wenn ich Castle.Windsor referenziere, aber nicht Castle.MicroKernel. : p
Ich stimme den anderen Kommentaren hier zu. Es gibt eine Referenz, im Klartext irgendwo ! Ich hatte ähnliche Probleme in der Vergangenheit, wo das Durchsuchen der Projektdateien nichts zurückgab, stellt sich heraus, dass es in einer anderen Datei war, die nicht automatisch in der Suche aufgenommen wurde.
Ich denke nicht, dass das Erstellen eines neuen Projekts hier die Lösung ist. Sie müssen sicher sein, dass KEINE der Referenzen in Ihrem Abhängigkeitsbaum SuperException verwenden. KEINE
Ich habe das noch nie bis zu dem Punkt erlebt, an dem ich das Projekt buchstäblich wegwischen musste, ich habe die Referenz irgendwo gefunden. Stellen Sie sicher, dass Sie nach jeder -Datei suchen.
Nur ein Punkt, der hinzugefügt werden muss, wenn die Position, auf die der Fehler zeigt, zufällig erscheint, kann dies oft bedeuten, dass die kompilierte Quelle und die Quellcodedatei nicht übereinstimmen. Ist dies eine ASP.NET-Anwendung? Ich hatte es zuvor, wo die kompilierten DLLs nicht bei einer Neuerstellung in der ASP.NET-Temp-Ordner ersetzt wurden, wodurch Dinge zu bekommen .. Interessant beim Debuggen:)
Ich glaube nicht, dass das ein Code-Problem ist. Was ich sehen kann, ist, dass eine Ihrer vorhandenen Referenzen wahrscheinlich auf diesen Typ in ihren eigenen Typen beruht, die Sie wahrscheinlich in Ihrer Anwendung erstellen.
Wenn das der Fall ist, benötigen Sie diese Referenz, auch wenn Sie den Typ nicht explizit verwenden und obwohl die andere referenzierte Assembly eine eigene Referenz hat. Dieses Problem tritt manchmal bei Komponenten von Drittanbietern auf, die Verweise auf Typen benötigen, auf die Sie nicht verwiesen haben. Der Compiler erkennt offensichtlich etwas in einer Ihrer vorhandenen referenzierten Assemblys und erwartet, dass Sie auf die abhängige verweisen.
Da es sich um einen Compilerfehler handelt, muss irgendwo im Projekt ein Verweis oder eine Verwendung von SuperException vorhanden sein.
Nimm die Zeile, in der der Compiler den Fehler anzeigt, und fange an, den Vererbungsbaum der Objekte, die in dieser Zeile verwendet werden, zu verfolgen. Du könntest die Quelle dafür finden.
Danke für deine Antworten bisher. Ich habe jeden Vorschlag (außer einem) vergebens ausprobiert.
Der Vorschlag, den ich nicht ausprobiert habe, ist, ein neues Projekt zu erstellen und all meine Sachen hinzuzufügen, deren Gedanke wirklich meinen Lebenswillen testet. ;) Ich kann das morgen versuchen, wenn ich gestört werden kann. Nochmals vielen Dank.
Es gibt heutzutage wirklich nichts sehr Mysteriöses an VS-Projekten - es sind nur Textdateien, usw. SOMETHING muss auf diese Klasse / DLL verweisen, und das muss Teil Ihres Projekts sein.
Haben Sie wirklich den gesamten Lösungsbaum, jede einzelne Datei , geupdated oder gefunden, um einen Verweis auf diese Ausnahme zu erhalten?
Das klingt ziemlich seltsam. Hier ist, was ich als nächstes überprüfen würde:
Versuchen Sie, ein neues Projekt zu erstellen und alle Ihre Klassen hinzuzufügen.
Wenn Sie auf Typen verweisen, die von SuperException erben (auch wenn der Typ in einer anderen Assembly definiert ist), benötigen Sie einen Verweis auf die Assembly, für die SuperException definiert ist.
Darauf abgestimmt.
Sie verweisen möglicherweise nicht auf SuperException
, aber Sie verweisen möglicherweise auf SpecializedSuperException
, das von SuperException
abgeleitet ist oder irgendwie anderweitig% verwendet - Ihr grep des Projekts für SuperException
fängt es jedoch nicht ab .
Versuchen Sie einen Hack mit der Testversion von NDepend
Das ist der Punkt, an dem sich Werkzeuge wie Resharper wirklich auszahlen - ein einfacher Find Usages sagt mir normalerweise von solchen "Geisterabhängigkeiten" mehrmals.
Vielleicht könnten Sie zu Ihrer Definition der SuperException-Klasse gehen und versuchen, alle Referenzen zu finden (). Sie können auch untersuchen, ob die Assembly SuperException eine zirkuläre Abhängigkeit auf Ihrer Hauptbaugruppe hat (z. B. hängt die Hauptbaugruppe von der Ausnahmebaugruppe ab, hängt von der Hauptbaugruppe ab ...).
Ich hatte ein sehr ähnliches Assembly-Referenzproblem, das passierte, als meine C # -Bibliothek eine abhängige C ++ / CLI-Assembly hatte. Das Problem, das ich war, erbte eine öffentliche Klasse von dieser C ++ / CLI-Assembly in meiner C # -Assemblerbibliothek. Das bedeutet, dass die Vererbungskette sich über mehrere Assemblies erstreckt.
Ich hatte gehofft, dass jeder Client schlau genug wäre, die C ++ / CLI-Assembly zu jeder Zeit zu laden, wenn die C # -Bibliothek dies benötigte, aber das war selbst zur Kompilierzeit nicht der Fall.
Ich löste dieses Problem, indem ich die Vererbung zwischen den Klassen, die sich über diese beiden Assembly-Bibliotheken erstreckten, auftrennte und stattdessen die Aggregation verwendete. Mein Client war endlich zufrieden und benötigte die C ++ / CLI-Assembly nicht mehr als Abhängigkeit.
In Ihrem Wort müssten Sie wahrscheinlich sicherstellen, dass SuitableStandardException
nicht von SuperException
erbt, um SuperException.DLL
als Referenz zu eliminieren.
Verwenden Sie die Einkapselung anstelle der Vererbung und erstellen Sie ein SuperException
Datenelement in Ihrer neuen SuitableStandardException
.
Wenn dies nicht gelöst wird, haben Sie möglicherweise mehr Klassen, die die Vererbung über einige Assemblies hinweg umfassen, in Ihrem Fall SuperAssembly.DLL
und superException.dll
.
Wenn Sie nicht alle von ihnen finden können, versuchen Sie diesen Trick:
Machen Sie alle Ihre öffentlichen Mitglieder und Klassen in SuperAssembly.DLL
internal.
In der SuperAssembly.DLL freunde mit SuperException.DLL
:
Stellen Sie sicher, dass sie den SuperAssembly.DLL
-Verweis von jedem Client erstellen und entfernen, der bereits auf SuperException.DLL
verweist.
Tags und Links dependencies .net c#