.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.
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.
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>
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.
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
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.
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.