Visual Studio: chemins de références d'assembly relatifs

96

Lors de l'ajout d'une référence à un assembly situé dans le répertoire de la solution, existe-t-il un moyen de l'ajouter de manière relative, de sorte que lorsqu'il est archivé et sorti d'un référentiel, il soit correctement référencé dans les projets?

theringostarrs
la source
13
Si cela ne fonctionne pas tout à fait à partir de l'interface utilisateur, rappelez-vous que vous pouvez simplement modifier manuellement le fichier .proj directement et changer le chemin en relatif. Une fois que vous le modifiez dans un sens ou dans l'autre, il reste tel que vous l'avez dit.
Pavel Minaev
1
Dans Visual Studio 2010, les chemins de référence sont stockés en tant que relatifs par défaut, donc si cela vous arrive, quelque chose d'autre ne va pas. Dans mon cas, j'avais couvert les DLL ignorées du contrôle de version afin de pouvoir compiler la solution, mais mes collègues ne pouvaient pas.
Giles Roberts

Réponses:

124

Pour développer le commentaire original de Pavel Minaev - L'interface graphique de Visual Studio prend en charge les références relatives en supposant que votre .sln est la racine de la référence relative. Donc, si vous avez une solution C:\myProj\myProj.sln, toutes les références que vous ajoutez dans les sous-dossiers de C:\myProj\sont automatiquement ajoutées en tant que références relatives.

Pour ajouter une référence relative dans un répertoire distinct, par exemple C:/myReferences/myDLL.dll, procédez comme suit:

  1. Ajoutez la référence dans l'interface graphique de Visual Studio en cliquant avec le bouton droit sur le projet dans l'Explorateur de solutions et en sélectionnant Ajouter une référence ...
  2. Trouvez le * .csproj où cette référence existe et ouvrez-le dans un éditeur de texte
  3. Modifiez le <HintPath> pour qu'il soit égal à

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

Cela fait maintenant référence C:\myReferences\myDLL.dll.

J'espère que cela t'aides.

CrimsonX
la source
20
Je comprends que cela est utile et correct, mais l'interface graphique VS ne fournit-elle pas sérieusement un moyen d'ajouter une référence relative?
kdbanman
4
Dans VS 2015, j'ai ce comportement par défaut (chemin relatif)
Mugen
2
J'étais convaincu que cela avait ajouté un chemin absolu, jusqu'à ce que j'ai suivi vos directions par curiosité. VS a montré un chemin absolu dans les propriétés de référence, mais <HintPath> était déjà relatif. Il s'avère qu'il me manquait des fichiers O_o lolimaderp!
donutguy640
@ donutguy640 Cela m'a aussi troublé. Ils devraient également afficher le chemin relatif dans le volet des propriétés
Alexander Derck
1
Vous n'êtes pas obligé de modifier directement le fichier de projet. Sélectionnez "parcourir" dans la boîte de dialogue d'ajout de référence, accédez au dossier contenant votre fichier de projet, puis ajoutez le chemin relatif à votre DLL. Bien qu'un chemin absolu soit affiché dans la fenêtre des propriétés, le chemin relatif est enregistré dans le fichier projet. VS devrait vraiment afficher le chemin comme il est enregistré dans le fichier de projet.
needfulthing
9

Oui, créez simplement un répertoire dans votre solution comme lib /, puis ajoutez votre dll à ce répertoire dans le système de fichiers et ajoutez-le dans le projet (Add-> Existing Item-> etc). Ajoutez ensuite la référence en fonction de votre projet.

J'ai fait cela plusieurs fois sous svn et sous cvs.

Freddy
la source
5
Vous n'avez pas besoin d'ajouter la dll au projet lui-même, ajoutez-y simplement une référence. La meilleure chose à faire est d'ajouter tout le répertoire 'lib' à votre contrôle de source. Voir code.google.com/p/projectpilot/source/browse/#svn/trunk à titre d'exemple
Igor Brejc
1
Vous avez raison. J'ai vérifié un ancien projet et ni le répertoire ni les dll n'ont été ajoutés au projet lui-même, juste au référentiel. Et la référence est alors relative au projet. Désolé pour ça.
Freddy
3

Dans VS 2017, c'est automatique. Alors Add Referencecomme d'habitude.

Notez que dans Reference Propertiesle chemin absolu est affiché, mais en .vbproj/.csprojrelatif est utilisé.

<Reference Include="NETnetworkmanager">
      <HintPath>..\..\libs\NETnetworkmanager.dll</HintPath>
      <EmbedInteropTypes>True</EmbedInteropTypes>
</Reference>
Iurii Vasylenko
la source
2

Le moyen le plus simple d'y parvenir est probablement d'ajouter simplement la référence à l'assemblage, puis de corriger (manuellement) la représentation textuelle de la référence dans le fichier de projet Visual Studio correspondant (extension .csproj) de manière à ce qu'elle devienne relative.

Je l'ai fait plusieurs fois dans VS 2005 sans aucun problème.

Uwe Honekamp
la source
3
Je pense qu'il n'est pas nécessaire de modifier le fichier de projet manuellement. D'après mon expérience, Visual Studio utilise toujours des chemins relatifs. La seule fois où j'ai eu à modifier le fichier de projet à la main, c'était lorsque je voulais partager un fichier clé (.snk). Visual Studio copie toujours simplement le fichier de clé dans le répertoire du projet, ce qui entraîne plusieurs copies du fichier de clé.
Stefan Egli
1

Je ne suis peut-être pas ici, mais il semble que la réponse soit assez évidente: regardez les chemins de référence dans les propriétés du projet. Dans notre configuration, j'ai ajouté notre dossier de référentiel commun, à la fenêtre de l'interface graphique du chemin de référence, comme ceci

Chemins de référence dans VS20xx

De cette façon, je peux copier mes dll (prêtes à être publiées) dans ce dossier et chaque développeur obtient maintenant la DLL mise à jour chaque fois qu'il construit à partir de ce dossier.

Si la dll est trouvée dans la solution, le constructeur doit donner la priorité à la version locale par rapport à la version d'équipe publiée.

Christian
la source
Malheureusement, cela est conservé dans le fichier csproj.user et n'est pas relatif.
Jamie Kitson le
0

Comme mentionné précédemment, vous pouvez modifier manuellement le .csprojfichier de votre projet afin de l'appliquer manuellement.

J'ai également remarqué que Visual Studio 2013 tente d'appliquer un chemin relatif au chemin d'indication de référence, probablement en raison d'une tentative de rendre le fichier de projet plus portable.

Nick L.
la source