Visual Studio: percorsi dei riferimenti ad assembly relativi


96

Quando si aggiunge un riferimento a un assembly situato all'interno della directory della soluzione, esiste un modo per aggiungerlo in modo relativo, in modo che quando viene archiviato e rimosso da un repository venga referenziato correttamente nei progetti?


13
Se non funziona correttamente dall'interfaccia utente, ricorda che puoi semplicemente modificare manualmente il file .proj e cambiare il percorso in relativo. Una volta modificato in entrambi i casi, rimane come l'hai messo.
Pavel Minaev

1
In Visual Studio 2010 i percorsi di riferimento sono archiviati come relativi per impostazione predefinita, quindi se questo ti sta accadendo qualcos'altro è sbagliato. Nel mio caso era che avrei ignorato le DLL dal controllo della versione in modo da poter compilare la soluzione ma i miei colleghi non potevano.
Giles Roberts

Risposte:


124

Per espandere il commento originale di Pavel Minaev - La GUI per Visual Studio supporta i riferimenti relativi con il presupposto che il tuo .sln sia la radice del riferimento relativo. Quindi, se hai una soluzione C:\myProj\myProj.sln, tutti i riferimenti che aggiungi nelle sottocartelle di C:\myProj\vengono aggiunti automaticamente come riferimenti relativi.

Per aggiungere un riferimento relativo in una directory separata, ad esempio C:/myReferences/myDLL.dll, eseguire le operazioni seguenti:

  1. Aggiungere il riferimento nella GUI di Visual Studio facendo clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e selezionando Aggiungi riferimento ...
  2. Trova il * .csproj dove si trova questo riferimento e aprilo in un editor di testo
  3. Modifica <HintPath> in modo che sia uguale a

    <HintPath>..\..\myReferences\myDLL.dll</HintPath>

Questo ora fa riferimento C:\myReferences\myDLL.dll.

Spero che questo ti aiuti.


20
Capisco che questo sia utile e corretto, ma la GUI di VS non fornisce seriamente un modo per aggiungere un riferimento relativo?
kdbanman

4
In VS 2015 ho ottenuto questo comportamento per impostazione predefinita (percorso relativo)
Mugen

2
Ero convinto che avesse aggiunto un percorso assoluto, finché non ho seguito le tue indicazioni per curiosità. VS ha mostrato un percorso assoluto nelle proprietà di riferimento, ma <HintPath> ha mostrato come già relativo. Si scopre che mi mancavano i file O_o lolimaderp!
donutguy640

@ donutguy640 Anche questo mi ha confuso. Dovrebbero anche mostrare il percorso relativo nel riquadro delle proprietà
Alexander Derck

1
Non è necessario modificare direttamente il file di progetto. Seleziona "Sfoglia" nella finestra di dialogo Aggiungi riferimento, vai alla cartella con il file di progetto, quindi aggiungi il percorso relativo alla DLL. Sebbene un percorso assoluto sia visualizzato nella finestra delle proprietà, il percorso relativo viene salvato nel file di progetto. VS dovrebbe davvero visualizzare il percorso proprio come viene salvato nel file di progetto.
needfulthing

9

Sì, crea una directory nella tua soluzione come lib /, quindi aggiungi la tua dll a quella directory nel filesystem e aggiungila nel progetto (Aggiungi-> Elemento esistente-> ecc.). Quindi aggiungi il riferimento in base al tuo progetto.

L'ho fatto diverse volte sotto svn e sotto cvs.


5
Non è necessario aggiungere la dll al progetto stesso, basta aggiungere un riferimento ad essa. La cosa migliore da fare è aggiungere l'intera directory "lib" al controllo del codice sorgente. Vedi code.google.com/p/projectpilot/source/browse/#svn/trunk come esempio
Igor Brejc

1
Hai ragione. Ho controllato un vecchio progetto e né la directory né le dll sono state aggiunte al progetto stesso, solo al repository. E il riferimento è quindi relativo al progetto. Mi dispiace per quello.
Freddy

3

In VS 2017 è automatico. Così Add Referencecome al solito.

Si noti che in Reference Propertiesassoluto viene mostrato il percorso, ma in .vbproj/.csprojrelativo viene utilizzato.

<Reference Include="NETnetworkmanager">
      <HintPath>..\..\libs\NETnetworkmanager.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>

2

Probabilmente, il modo più semplice per ottenere ciò è semplicemente aggiungere il riferimento all'assembly e quindi (manualmente) applicare la patch alla rappresentazione testuale del riferimento nel file di progetto di Visual Studio corrispondente (estensione .csproj) in modo che diventi relativo.

L'ho fatto molte volte in VS 2005 senza problemi.


3
Penso che non sia necessario modificare manualmente il file di progetto. Nella mia esperienza Visual Studio utilizza sempre percorsi relativi. L'unica volta che ho dovuto modificare il file di progetto a mano è stato quando volevo condividere un file chiave (.snk). Visual Studio copia sempre e solo il file della chiave nella directory del progetto, il che si traduce in diverse copie del file della chiave.
Stefan Egli

1

Potrei essere fuori di qui, ma sembra che la risposta sia abbastanza ovvia: guarda i percorsi di riferimento nelle proprietà del progetto. Nella nostra configurazione ho aggiunto la nostra cartella del repository comune, alla finestra della GUI del percorso di riferimento, in questo modo

Percorsi di riferimento in VS20xx

In questo modo posso copiare le mie dll (pronte per la pubblicazione) in questa cartella e ogni sviluppatore ora ottiene la DLL aggiornata ogni volta che viene compilata da questa cartella.

Se la dll si trova nella soluzione, il builder dovrebbe dare la priorità alla versione locale rispetto alla versione del team pubblicata.


Sfortunatamente questo è conservato nel file csproj.user e non è relativo.
Jamie Kitson

0

Come accennato prima, puoi modificare manualmente il file .csproj file per applicarlo manualmente.

Ho anche notato che Visual Studio 2013 tenta di applicare un percorso relativo all'hintpath di riferimento, probabilmente a causa di un tentativo di rendere il file di progetto più portabile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.