Подтвердить что ты не робот

.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>, поэтому я ищу другой способ приблизиться к такому же поведению.

4b9b3361

Ответ 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