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

В C++ я бы поместил путь зависимости в автономный список свойств и распространил другую версию с SDK. Но в C# нет списков свойств, и я не хочу поддерживать две версии полного проекта.

Я видел этот вопрос, который утверждает, что я не могу использовать несколько <HintPath> теги, поэтому я ищу другой способ приблизиться к тому же поведению.

6 ответов

Решение

Я нашел хакерское решение, которое работает для моего случая, где родительский каталог гарантированно будет отличаться где-то вверх по дереву:

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

Самый простой способ, поскольку можно использовать только ОДИН 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>

Если несколько условий совпадают, будет использовано последнее.

Я использую это решение без каких-либо проблем:

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

Понял отсюда: используйте подсказки путей относительного ответа от Леонида Васильева

Добавьте дополнительный путь следующим образом к группе общих свойств. в файле csproj

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

ReferencePath Свойство предназначено для указания при выполнении MsBuild, но оно будет нормально работать следующим образом.

Вы могли бы подставить /csharp/bin папка в дисковод (по-разному на каждой машине), например X: а затем ссылка X:\ или же X:\bin на обеих машинах, поскольку путь теперь будет одинаковым.

Просто добавьте расположение сервера сборки DLL-файлов как путь ссылки на проект. Кажется, делать хорошо, и очень просто. Работает только в том случае, если вы знаете папку DLL-библиотеки на сервере сборки.

введите описание изображения здесь

Другие вопросы по тегам