Verbleibende Assemblyabhängigkeit in C # .NET

8

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:

  1. Alle Verwendungen von SuperException wurden aus dem Projektcode entfernt.
  2. Verglichen mit einem anderen Projekt, das ohne Verweis auf 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!
  3. Ich habe die "Clean Solution" von Visual Studio gemacht und alles von Hand mehrmals gelöscht.

Es ist nicht das Ende der Welt, diese Referenz aufzunehmen, ich sehe einfach nicht, warum es mehr nötig ist. Nrrrgg. Alle Hinweise willkommen!

    
Dogmang 12.08.2008, 19:35
quelle

14 Antworten

3

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

    
Henrik 18.02.2009, 02:23
quelle
2
  1. Beenden Sie Visual Studio
  2. Löschen Sie die Ordner bin und obj in Ihrem Lösungsverzeichnis
  3. Neustart und sehen, was passiert
Michael Stum 12.08.2008 19:56
quelle
2

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.

BEARBEITEN:

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:)

    
Rob Cooper 12.08.2008 21:41
quelle
2

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.

    
Shaun Austin 21.08.2008 14:11
quelle
1

Da es sich um einen Compilerfehler handelt, muss irgendwo im Projekt ein Verweis oder eine Verwendung von SuperException vorhanden sein.

  1. Führen Sie im gesamten Projekt oder in der Lösung für diesen Typ eine Suche / Ersetzung durch und entfernen Sie alle Referenzen (möglicherweise haben Sie dies bereits getan).
  2. 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.

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.

    
Joseph Daigle 12.08.2008 19:48
quelle
1

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.

    
Dogmang 12.08.2008 20:38
quelle
1

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?

    
Will Dean 12.08.2008 20:46
quelle
0

Das klingt ziemlich seltsam. Hier ist, was ich als nächstes überprüfen würde:

  1. Überprüfen Sie, ob in Ihrer Datei Properties / AssemblyInfo.cs nichts mehr vorhanden ist.
  2. Überprüfen Sie, ob in der Datei SuperUI.csproj nichts mehr vorhanden ist.
  3. Löschen Sie alle Referenzen und fügen Sie sie erneut hinzu.
Iain Holder 12.08.2008 19:46
quelle
0

Versuchen Sie, ein neues Projekt zu erstellen und alle Ihre Klassen hinzuzufügen.

    
Lance Fisher 12.08.2008 19:51
quelle
0

Geben Sie Ihren Projektordner an. Es könnte sich um eine versteckte Referenz in Ihrem Projekt oder um ein Projekt handeln, auf das Ihr Projekt verweist. Reinigen Sie den Editor bei Bedarf.

    
Stu 12.08.2008 20:06
quelle
0
  

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

    
Orion Edwards 12.08.2008 21:49
quelle
0

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

    
Jon Limjap 13.08.2008 01:05
quelle
0

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:

  1. Machen Sie alle Ihre öffentlichen Mitglieder und Klassen in SuperAssembly.DLL internal.

  2. In der SuperAssembly.DLL freunde mit SuperException.DLL :

    %Vor%
  3. Stellen Sie sicher, dass sie den SuperAssembly.DLL -Verweis von jedem Client erstellen und entfernen, der bereits auf SuperException.DLL verweist.

dmihailescu 22.04.2011 21:10
quelle
-1

grep -R SuperException * in der Basis Ihres Projekts (holen Sie grep von irgendwo zuerst), nur um sicher zu sein.

    
Bernard 13.08.2008 00:29
quelle

Tags und Links