.csproj несколько путей подсказки для сборки
Я использую код примера для распространения SDK. В распределении относительный путь от кода к сборкам SDK отличается от сборки. Например:
Распределение
csharp/bin/assembly.dll
example/ex1/ex1.csproj
Машина сборки
foo/sdk/csharp/bin/assembly.dll
bar/baz/quux/ex1/ex1.csproj
Предположим, что я ничего не могу двинуть. Есть ли способ, которым я могу дать указание ex1.csproj
посмотреть в обоих
../../csharp/bin/
и ../../../../foo/sdk/csharp/bin/
для assembly.dll
?
В С++ я поместил путь зависимостей в автономный лист свойств и распространил другую версию с SDK. Но у С# нет листов свойств, и я не хочу поддерживать две версии полного проекта.
Я видел этот вопрос, в котором говорится, что я не могу использовать несколько тегов <HintPath>
, поэтому я ищу другой способ приблизиться к такому же поведению.
Ответы
Ответ 1
Я нашел хакерское решение, которое работает для моего случая, где родительский каталог гарантированно отличается от дерева:
<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>
Ответ 2
Самый простой способ, с помощью которого можно использовать только ONE HintPath, - использовать атрибут "все так хорошо", как это:
<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>
Таким образом, ответ на вопрос будет следующим:
<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>
Ответ 3
Добавьте вторичный путь следующим образом в общую группу свойств. в файле csproj
<PropertyGroup>
<ReferencePath>..\..\..\..\..\foo\sdk\csharp\bin\</ReferencePath>
...
</PropertyGroup>
Свойство ReferencePath
должно указываться при выполнении MsBuild, но оно будет работать так:
Ответ 4
Вы можете подставить папку /csharp/bin
в дисковод (по-разному на каждом компьютере), например X:
, а затем ссылаться на X:\
или X:\bin
на обеих машинах, так как путь теперь будет таким же.
Ответ 5
Просто добавьте расположение сервера сборки DLL в качестве справочного пути в проекте. Кажется, сделать трюк красиво и очень просто. Работает только в том случае, если вы знаете папку сервера сборки DLL.
![enter image description here]()