Was genau ist der Unterschied zwischen der HintPath
in einer .csproj-Datei und der ReferencePath
in einer .csproj.user
Datei? Wir versuchen, uns auf eine Konvention festzulegen, bei der sich Abhängigkeits-DLLs in einem SVN-Repo "Releases" befinden und alle Projekte auf ein bestimmtes Release verweisen. Da verschiedene Entwickler unterschiedliche Ordnerstrukturen haben, funktionieren relative Referenzen nicht. Daher haben wir ein Schema entwickelt, mit dem eine Umgebungsvariable verwendet wird, die auf den Release-Ordner des jeweiligen Entwicklers verweist, um eine absolute Referenz zu erstellen. Nachdem eine Referenz hinzugefügt wurde, bearbeiten wir die Projektdatei manuell, um die Referenz mithilfe der Umgebungsvariablen in einen absoluten Pfad zu ändern.
Ich habe festgestellt, dass dies sowohl mit dem HintPath
als auch mit dem möglich ist ReferencePath
, aber der einzige Unterschied, den ich zwischen ihnen feststellen konnte, besteht darin, dass er HintPath
beim Erstellen und ReferencePath
beim Laden des Projekts in die IDE behoben wird. Ich bin mir jedoch nicht sicher, welche Konsequenzen dies hat. Ich habe bemerkt, dass VS das manchmal umschreibt .csproj.user
und ich das umschreiben muss ReferencePath
, aber ich bin nicht sicher, was das auslöst.
Ich habe gehört, dass es am besten ist, die .csproj.user
Datei nicht einzuchecken, da sie benutzerspezifisch ist, daher möchte ich darauf abzielen, aber ich habe auch gehört, dass das HintPath
Laden der angegebenen DLL nicht "garantiert" ist, wenn Die gleiche DLL befindet sich zB im Ausgabeverzeichnis des Projekts. Irgendwelche Gedanken dazu?
quelle
Suchen Sie in der Datei Microsoft.Common.targets
Die Antwort auf die Frage befindet sich in der Datei
Microsoft.Common.targets
für Ihre Ziel-Framework-Version.Für .Net Framework Version 4.0 (und 4.5!) Ist das AssemblySearchPaths-Element folgendermaßen definiert:
Für .Net Framework 3.5 ist die Definition dieselbe, aber der Kommentar ist falsch. Die 2.0-Definition unterscheidet sich geringfügig und verwendet $ (OutputPath) anstelle von $ (OutDir).
Auf meinem Computer befinden sich die folgenden Versionen der Datei Microsoft.Common.targets:
Dies ist mit Visual Studio 2008, 2010 und 2013 unter Windows 7 installiert.
Die Tatsache, dass das Ausgabeverzeichnis durchsucht wird, kann etwas frustrierend sein (wie das Originalposter zeigt), da möglicherweise ein falscher Hinweispfad ausgeblendet wird. Die Lösung wird auf Ihrem lokalen Computer in Ordnung erstellt, bricht jedoch ab, wenn Sie in einer sauberen Ordnerstruktur (z. B. auf dem Buildcomputer) aufbauen.
quelle
Meine eigene Erfahrung hat gezeigt, dass es am besten ist, sich an eine von zwei Arten von Baugruppenreferenzen zu halten:
Ich habe festgestellt (ähnlich wie Sie beschrieben haben), dass andere Methoden entweder zu leicht zu brechen sind oder lästige Wartungsanforderungen haben.
Jede Assembly, die ich nicht zu GAC machen möchte, muss im Ausführungsverzeichnis leben. Jede Assembly, die sich nicht im Ausführungsverzeichnis I GAC befindet oder nicht befinden kann (verwaltet durch automatische Build-Ereignisse).
Das hat mir bisher keine Probleme bereitet. Ich bin mir zwar sicher, dass es eine Situation gibt, in der es nicht funktioniert, aber die übliche Antwort auf jedes Problem war "Oh, nur GAC it!". 8 D.
Hoffentlich hilft das!
quelle
Dies ist zwar ein altes Dokument, aber es hat mir geholfen, das Problem zu lösen, dass 'HintPath' auf einem anderen Computer ignoriert wird. Dies lag daran, dass sich die referenzierte DLL auch in der Quellcodeverwaltung befinden musste:
https://msdn.microsoft.com/en-us/library/ee817675.aspx#tdlg_ch4_includeoutersystemassemblieswithprojects
Auszug:
quelle