2017-12-04 1 views
0

Ich habe eine Reihe von Assemblies DLL in einem Ordner. Ich öffne ein Projekt und füge Referenzen zu diesen Dateien hinzu.Referenzen in Visual Studio 2017 unter der Haube

Et voila ', Visual Studio kopieren Sie diese DLLs in den Ausgabeordner (Debug/Release/Whatever), ändern Sie die Referenzen, so dass sie dort zeigen und ... behält in der PRJ-Datei den ursprünglichen Pfad.

Ergebnis: Ich aktualisiere eins, einige, alle dll, und Visual Studio kann sich nicht kümmern, denn alles, was es verwenden will, ist die lokale dll. Und, um die Magie hinzuzufügen, wenn ich ein Rebuild mache (was ein Clean und dann ein Build macht), sind die Referenzen nicht mehr gültig, weil das Clean die kopierte Datei entfernt hat.

Warum funktioniert das so?

+0

Wenn Sie Komponenten referenzieren, die die Ausgabe eines anderen VS-Projekts sind, verweisen Sie vorzugsweise auf das Projekt, nicht auf die erstellte Ausgabe. In jedem Fall können Sie "Copy Local" für diese Referenzen deaktivieren (siehe "Eigenschaften" von), um VS anzuweisen, die DLL nicht in den Ausgabeordner Ihres Projekts zu kopieren. – Filburt

+0

Verweisen auf andere Projekte war es immer der schlechteste Weg: Sie zwingen ein ganzes Unternehmen, das Netzwerk und das Code-Versions-System so zu strukturieren, dass jeder alles sehen kann und Sie in Ihrem Visual Studio Dutzende oder Hunderte von Projekten laden brauche es nicht und das belastet nur den PC. Die Option "Lokal kopieren" funktioniert nicht, da die DLL beim Ausführen der Software nicht gefunden wird. Visual Studio sollte lokal von der ursprünglichen Quelle kopieren und einen Verweis darauf behalten und weiterhin lokal kopieren, anstatt einmal lokal zu kopieren und die Verweise intern zu ändern. – motoDrizzt

+0

Auf den zweiten Blick scheint es, Sie vermissen nur die "Copy Always: true" -Option, um VS zu zwingen, die DLLs auf * jeden Build * ziehen, aber es gibt keine Möglichkeit VS anzuweisen Referenzen zu ziehen * jedes Mal wenn Sie * Ihr Projekt ausführen. – Filburt

Antwort

1

Ok, ich habe zufällig die Antwort gefunden, es ist nur eine Frage von schlechten Einstellungen Name.

Zuerst Visual Studio hat eine Option "Copy Local": Sie können denken, dass die Einstellung auf "Nein" wird den Trick tun, aber es funktioniert nicht (was offensichtlich ist, nachdem Sie es versuchen), weil er kopiert die DLL nicht in den Ausgabeordner, wenn die Software ausgeführt wird, findet sie sie nicht (es sei denn, wir sprechen über Assemblys im GAC, aber das ist eine andere Geschichte).

An sich ist das Problem, dass Visual Studio lokal aus der ursprünglichen Quelle kopieren und einen Verweis darauf behalten sollte, stattdessen kopiert es einmal in den Ausgabeordner und ändert ab diesem Zeitpunkt intern die Verweise auf den Ausgabeordner. Es behält immer noch die ursprünglichen Verweise in die prj-Datei, aber dann ignoriert es sie (so dass, wenn Sie das Projekt oder die Lösung reinigen gibt es keine DLL mehr und es kompiliert nicht mehr)

Die Lösung? Die Einstellung als "Spezifische Version" bezeichnet. Trotz seines Namens erzwingt es nicht die Verwendung der spezifischen Version der DLL, auf die Sie verwiesen haben, sondern teilt Visual Studio (gekoppelt mit Copy Local = Yes) das Äquivalent von "Copy Always" mit.