HintPath vs ReferencePath in Visual Studio

Qual è esattamente la differenza tra HintPath in un file .csproj e il ReferencePath in un file .csproj.user ? Stiamo provando a impegnarci in una convenzione in cui le DLL di dipendenza sono in un repository svn “release” e tutti i progetti puntano a una versione specifica. Poiché diversi sviluppatori hanno strutture di cartelle diverse, i riferimenti relativi non funzioneranno, quindi abbiamo creato uno schema per utilizzare una variabile di ambiente che punta alla cartella delle versioni dello sviluppatore particolare per creare un riferimento assoluto. Quindi, dopo aver aggiunto un riferimento, modifichiamo manualmente il file di progetto per cambiare il riferimento a un percorso assoluto utilizzando la variabile di ambiente.

Ho notato che questo può essere fatto sia con HintPath che con ReferencePath , ma l’unica differenza che ho potuto trovare è che HintPath viene risolto in build-time e ReferencePath quando il progetto viene caricato nell’IDE. Non sono davvero sicuro di quali siano le conseguenze di ciò. Ho notato che VS a volte riscrive il .csproj.user e devo riscrivere il ReferencePath , ma non sono sicuro di cosa lo inneschi.

Ho sentito che è meglio non controllare il file .csproj.user poiché è specifico per l’utente, quindi mi piacerebbe farlo, ma ho anche sentito che la DLL specificata da HintPath non è “garantita” “da caricare se la stessa DLL si trova ad esempio nella directory di output del progetto. Qualche idea su questo?

Secondo questo blog MSDN: https://blogs.msdn.microsoft.com/manishagarwal/2005/09/28/resolving-file-references-in-team-build-part-2/

Esiste un ordine di ricerca per gli assiemi durante la costruzione. L’ordine di ricerca è il seguente:

  • File dal progetto corrente – indicati da $ {CandidateAssemblyFiles}.
  • $ (ReferencePath) proprietà proveniente da .user / target file.
  • Metadati% (HintPath) indicati dall’elemento di riferimento.
  • Directory del framework di destinazione.
  • Directory trovate nel registro che utilizza la registrazione AssemblyFoldersEx.
  • Cartelle di assembly registrate, indicate da $ {AssemblyFolders}.
  • $ (OutputPath) o $ (OutDir)
  • GAC

Quindi, se l’assembly desiderato viene trovato da HintPath , ma è ansible trovare un assembly alternativo utilizzando ReferencePath , preferirà l’assembly d di ReferencePath a HintPath ‘d one.

Cerca nel file Microsoft.Common.targets

La risposta alla domanda è nel file Microsoft.Common.targets per la versione del framework di destinazione.

Per .Net Framework versione 4.0 (e 4.5!) L’elemento AssemblySearchPaths è definito in questo modo:

    {CandidateAssemblyFiles}; $(ReferencePath); {HintPathFromItem}; {TargetFrameworkDirectory}; {Registry:$(FrameworkRegistryBase),$(TargetFrameworkVersion),$(AssemblyFoldersSuffix)$(AssemblyFoldersExConditions)}; {AssemblyFolders}; {GAC}; {RawFileName}; $(OutDir)  

Per .Net Framework 3.5 la definizione è la stessa, ma il commento è sbagliato. La definizione 2.0 è leggermente diversa, utilizza $ (OutputPath) anziché $ (OutDir).

Sulla mia macchina ho le seguenti versioni del file Microsoft.Common.targets:

 C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Microsoft.Common.targets C:\Windows\Microsoft.NET\Framework64\v3.5\Microsoft.Common.targets C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets 

Questo è con Visual Studio 2008, 2010 e 2013 installato su Windows 7.

Il fatto che la directory di output sia cercata può essere un po ‘frustrante (come fa notare il poster originale) perché potrebbe hide un HintPath errato. La soluzione si basa su OK sul computer locale, ma si interrompe quando si costruisce in una struttura di cartelle pulita (ad esempio sul computer di creazione).

La mia esperienza è stata che è meglio attenersi a uno dei due tipi di riferimenti all’assembly:

  • Un assembly “locale” nella directory di generazione corrente
  • Un’assemblea nel GAC

Ho trovato (molto come hai descritto) altri metodi per essere troppo facilmente infranti o avere fastidiosi requisiti di manutenzione.

Qualsiasi assembly che non voglio GAC, deve vivere nella directory di esecuzione. Qualsiasi assembly che non è o non può essere nella directory di esecuzione I GAC (gestito da eventi di build automatici).

Questo non mi ha dato alcun problema finora. Mentre sono sicuro che c’è una situazione in cui non funzionerà, la solita risposta a qualsiasi problema è stata “oh, solo GAC!”. 8 D

Spero possa aiutare!

Anche se questo è un vecchio documento, ma mi ha aiutato a risolvere il problema di ‘HintPath’ essere ignorato su un’altra macchina. Era perché la DLL di riferimento doveva essere anche nel controllo del codice sorgente:

https://msdn.microsoft.com/en-us/library/ee817675.aspx#tdlg_ch4_includeoutersystemassemblieswithprojects

Estratto:

 Per includere e quindi fare riferimento a un assembly del sistema esterno
 1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto che deve fare riferimento all'assieme e quindi fare clic su Aggiungi elemento esistente.
 2. Passare all'assieme e quindi fare clic su OK.  L'assieme viene quindi copiato nella cartella del progetto e aggiunto automaticamente a VSS (presupponendo che il progetto sia già sotto il controllo del codice sorgente).
 3. Utilizzare il pulsante Sfoglia nella finestra di dialogo Aggiungi riferimento per impostare un riferimento al file per l'assemblaggio nella cartella del progetto.