Verwalten von .NET-Assemblyabhängigkeiten nach DLL-Referenz und nicht nach Projektreferenz in VS

8

Wir haben ein .NET Projekt bestehend aus mehreren Teilprojekten (ca. 20). Es gibt mehrere Lösungen, die jeweils nur diejenigen Teilprojekte enthalten, die für die jeweilige Lösung relevant sind.

Um beliebige Lösungen zu ermöglichen, referenzieren unsere Teilprojekte niemals durch Projektreferenzen, sondern durch direkte DLL-Referenzen. Es gibt wenig Feinabstimmung der csproj-Datei, damit HintPath $ (Configuration) einbezieht, also baut Debug Debug-DLLs auf, und release baut Referenz Release-DLLs auf.

Alles funktioniert gut, aber es gibt zwei große Probleme - eins ist nervig und ein anderes ist wirklich akut:

  1. VS erkennt DLL-Referenzen zum Zwecke der Abhängigkeitsberechnung nicht. Wir müssen die Abhängigkeiten über den Dialog "Projektabhängigkeiten" jedes Mal neu angeben, wenn ein neues Projekt oder eine neue Referenz hinzugefügt wird. Das ist nervig.
  2. Wir benutzen weder Resharper noch Visual Assist (großartige Werkzeuge, aber wir benutzen sie nicht, das ist selbstverständlich). Wir verwenden gerne den Standard-Befehl "Browse to Definition" (zum Beispiel im Kontextmenü des Quellcodes). Das akute Problem ist, dass es nur projektübergreifend funktioniert, wenn ein Projekt den anderen über die Projektreferenz referenziert und es nicht funktioniert, wenn die Referenz die direkte DLL-Referenz ist, auch wenn das referenzierte Projekt in der Lösung enthalten ist ! Das ist ein echter Schwachpunkt, denn statt zur Quelle zu navigieren, navigiert er zu den Metadaten.

Ich suche nach einem Rat von Leuten da draußen, die DLL-Referenzen wie uns benutzen und diese beiden Probleme irgendwie überwunden haben. Danke.

BEARBEITEN:

Beachten Sie, dass neben dem "Browse to Definition" -Problem die Verwendung von Dll-Referenzen anstelle von Projektreferenzen nur einmalige Kosten für den Projektmanager verursacht - das heißt, die Projektabhängigkeiten jeder betroffenen Lösung zu aktualisieren, wenn ein neues Projekt hinzugefügt wird eine neue Abhängigkeit muss eingeführt werden. Diese Projektabhängigkeiten werden in der SLN-Datei beibehalten und erfordern keine Wartung, bis ein neues Projekt eintrifft oder eine neue Abhängigkeit erstellt wird, was nicht allzu oft passiert.

Wir verwenden msbuild zum Erstellen unserer Projekte auf dem CI-Server, der dieselben .sln-Dateien verwendet wie VS. Es gibt eine Hauptdatei .sln, die alle Unterprojekte enthält.

Ich möchte das akutere Problem hervorheben - die Unfähigkeit, zu einer Definition in einem anderen Projekt zu navigieren, obwohl beide Projekte in derselben Lösung sind, nur weil die Referenzen DLL-Referenzen sind. Das ist ärgerlich und es ist ein Ärgernis, es gibt keinen Grund, warum VS auf Projektreferenzen besteht, um das Feature zu aktivieren. Andere Tools wie Resharper oder Visual Assist haben diese Einschränkung nicht. Leider haben wir diese Werkzeuge nicht und werden es kaum in der beobachtbaren Zukunft haben.

    
mark 09.11.2009, 11:59
quelle

3 Antworten

7

Das Problem mit Ihrer Build-Konfiguration ist folgender: Sagen wir, Sie haben 3 Projekte und 2 Lösungen.

%Vor%

Plötzlich wird durch das Erstellen von Solution2 der Teil des Codes für Solution1 erstellt und in einem ungültigen Zustand belassen (die neuesten Binärdateien sind entweder nicht kompatibel oder mussten nicht erstellt werden).

>

Jedes Projekt sollte in einer einzigen Lösung enthalten sein. Andere Lösungen können sich darauf verlassen, sollten aber den Code dieser Projekte nicht aktiv ändern. Auf diese Weise können sie auf eine erstellte DLL verweisen, da es keinen Grund gibt, die externen Abhängigkeiten neu zu erstellen.

Zusammenfassend sollten Sie sich etwas Zeit nehmen und Ihre Lösungen neu strukturieren, um die folgenden Bedingungen zu erfüllen:

  • Jedes Projekt ist in genau einer Lösung enthalten.
  • Wenn ein Projekt von einem anderen Projekt in derselben Lösung abhängt, machen Sie es zu einer Projektreferenz.
  • Wenn ein Projekt von einem anderen Projekt in einer anderen -Lösung abhängt, machen Sie es zu einer DLL-Referenz.

Zusätzlich zu dem oben genannten empfehle ich, ein "Externals" -Verzeichnis zu erstellen, um Builds zu platzieren, wenn sie von anderen Lösungen referenziert werden. Nehmen wir an, Sie restrukturieren wie folgt:

%Vor%

In diesem Fall würden Sie Kopien von Project1.dll und Project1.pdb in Externals\Project1\Debug und Externals\Project1\Release und Referenz External\Project1$(Configuration)\Project1.dll in Project3 platzieren. Aktualisieren Sie nur die Builds im Verzeichnis Externals, wenn Sie bereit sind, den Build für alle anderen Lösungen zu verwenden.

    
Sam Harwell 09.11.2009 19:13
quelle
2

Gibt es einen Grund, warum Sie willkürliche Lösungen zulassen wollen? Es scheint einfacher zu sein, eine einzige Lösung zu erstellen und alle Projekte in diese Lösung zu integrieren. Ich versuche, wo immer möglich, mehrere Lösungen zu vermeiden.

    
Pedro 09.11.2009 17:52
quelle
-1

Es klingt für mich so, als ob die Probleme, denen Sie begegnen, das direkte Ergebnis sind, wenn Sie Ihr Werkzeug falsch benutzen. Visual Studio hat keine andere Möglichkeit, Projektabhängigkeiten automatisch zu berechnen, wenn Sie sie nicht verwalten lassen.

Es klingt, als hätten Sie zwei Möglichkeiten.

  1. Verwenden Sie Visual Studio zum Verwalten von Projektabhängigkeiten
  2. Verwenden Sie ein anderes Build-System (wie NAnt)

Es hört sich so an, als hätten Sie die Option # 1 ausgeschlossen, deshalb werde ich das nicht mehr behandeln. Damit bleibt nur die Option # 2 übrig.

Sie könnten NAnt verwenden, um Ihre individuellen CSproj-Projekte zu erstellen und Ihr NAnt-Build-Skript zu verwenden, um die Abhängigkeiten zwischen Projekten zu definieren. Es gibt zwei Nachteile.

  1. Sie müssen es alle Hand kaufen (was es klingt wie Sie bereit sind zu tun)
  2. Visual Studio wäre für Sie genauso kaputt wie jetzt.

Auf der zweiten Seite wäre Visual Studio nicht in der Lage, Ihre Lösung als Ganzes zu kompilieren, da diese Logik aus VS in ein externes Build-Skript verschoben worden wäre. Dies könnte zu Verwirrung zwischen den Entwicklern führen und würde den Debugging-Prozess behindern. Nicht zu sagen, dass diese Dinge nicht bewältigt werden können ... nur zu sagen, dass es bei diesen Schritten des Entwicklungsprozesses extra Setups geben würde.

    
Jason Whitehorn 09.11.2009 18:44
quelle