.csproj chemins d'indices multiples pour un assembly

J'empaquette un exemple de code pour une distribution SDK. Dans la distribution, le chemin relatif du code vers les assemblys SDK est différent de la machine de génération. Par exemple:

La Distribution

csharp/bin/assembly.dll
example/ex1/ex1.csproj

Construire La Machine

foo/sdk/csharp/bin/assembly.dll
bar/baz/quux/ex1/ex1.csproj

Supposons que je ne peux rien bouger. Y a-t-il un moyen de demander à ex1.csproj de regarder dans les deux

../../csharp/bin/ et ../../../../foo/sdk/csharp/bin/ pour assembly.dll?

En C++, je mettrais le chemin de dépendance dans une feuille de propriétés autonome et distribuer une version différente avec le SDK. Mais C# n'a pas de feuilles de propriétés, et je ne veux pas maintenir deux versions du projet complet.

J'ai vu cette question {[27] } qui indique que je ne peux pas utiliser plusieurs balises <HintPath>, donc je cherche un autre moyen d'approcher le même comportement.

50
demandé sur Community 2013-03-27 22:27:54

6 réponses

Le moyen le plus simple étant donné qu'un seul HintPath peut être utilisé est d'utiliser l'attribut all-so-nice Condition comme ceci:

<Reference Include="TheAssembly">
    <HintPath Condition="Exists('..\My\Assembly\Path')">..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\My\Assembly\Path')">..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\My\Assembly\Path')">..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\..\My\Assembly\Path')">..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\..\..\..\..\My\Assembly\Path')">..\..\..\..\..\..\..\My\Assembly\Path\TheAssembly.dll</HintPath>
    etc...
</Reference>

Donc la réponse à la question serait la suivante:

<Reference Include="assembly">
    <HintPath Condition="Exists('..\..\csharp\bin')">..\..\csharp\bin\assembly.dll</HintPath>
    <HintPath Condition="Exists('..\..\..\..\foo\sdk\csharp\bin')">..\..\..\..\foo\sdk\csharp\bin\assembly.dll</HintPath>
</Reference>

Si plusieurs conditions correspondent, la dernière sera utilisée.

65
répondu Wolf5 2018-06-11 07:08:57

J'ai trouvé une solution hacky qui fonctionne pour mon cas, où le répertoire parent est garanti différent quelque part dans l'arbre:

<Choose>
  <When Condition="Exists('$(MSBuildProjectDirectory)\..\..\example')">
    <ItemGroup>
      <Reference Include="Assembly ...">
        <HintPath>..\..\csharp\bin\assembly.dll</HintPath>
      </Reference>
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <Reference Include="Assembly ...">
         <HintPath>..\..\..\..\..\foo\sdk\csharp\bin\assembly.dll</HintPath>
      </Reference>
    </ItemGroup>
  </Otherwise>
</Choose>
20
répondu japreiss 2013-03-27 19:23:45

Ajoutez le chemin secondaire comme suit au groupe de propriétés générales. dans le fichier csproj

<PropertyGroup>
    <ReferencePath>..\..\..\..\..\foo\sdk\csharp\bin\</ReferencePath>
    ...
</PropertyGroup>

La propriété ReferencePath est destinée à être spécifiée lors de L'exécution de MsBuild, mais elle fonctionnera correctement comme ceci.

6
répondu Filip De Vos 2013-03-27 20:29:13

J'utilise cette solution sans aucun problème:

<Reference Include="log4net">
  <HintPath>
     $(SolutionDir)packages\log4net.2.0.8\lib\net45-full\log4net.dll
  </HintPath>
</Reference>

Je L'ai d'ici: utiliser les chemins d'indice réponse relative de LeonidVasilyev

1
répondu JReis 2018-02-14 15:46:00

Vous pouvez insérer le dossier /csharp/bin dans un lecteur (différemment sur chaque machine), par exemple X:, puis référencer X:\ ou X:\bin sur les deux machines, car le chemin sera maintenant le même.

0
répondu Axarydax 2013-03-27 18:30:19

Ajoutez simplement l'emplacement du serveur de génération des dll comme chemin de référence sur le projet. Semble faire l'affaire bien et est très simple. Fonctionne uniquement si vous connaissez le dossier du serveur de construction des dll.

entrez la description de l'image ici

-1
répondu BahaiResearch.com 2013-05-22 16:13:07