Использование одних и тех же ссылок на сборки в csproj с различными структурами папок

У меня есть проект C#, MyProject.csproj, который находится в решении со следующей структурой папок и ссылается на Dependency.dll:

  • Libs
    • Dependency.dll
  • проектов
    • Мой проект
      • MyProject.csproj

Таким образом, ссылка на Dependency.dll в MyProject.csproj имеет HintPath что-то вроде этого:

..\..\Libs\Dependency.dll

Теперь я хотел бы использовать MyProject в другом решении в другой структуре проекта, без изменений, в качестве источника. Это потому, что MyProject находится в своем собственном репозитории управления исходным кодом, и я использую его в различных решениях, таких как субпозитории Mercurial /Git. (Проблема может быть решена на уровне управления исходным кодом...) Такое разное решение будет выглядеть так:

  • Libs
    • Dependency.dll
  • Мой проект
    • MyProject.csproj

Обратите внимание, что папка MyProject теперь находится на том же уровне, что и папка Libs. Таким образом, оригинальный HintPath теперь недействителен (так как он должен быть ..\Libs\Dependency.dll) и я получаю ошибки сборки.

Есть ли способ исправить это, но сохранить один и тот же csproj для разных решений?

Я нашел следующие возможные решения, которые хороши, но требуют модификации csproj. Это в основном возможно в моем случае, но иногда есть внешние компоненты, где я не могу запросить такие модификации, поэтому я бы по возможности искал переопределение на уровне решения.

Спасибо.

1 ответ

Решение

На данный момент я решил проблему, используя технику, изложенную в этом посте.

<ItemGroup>
  <LibReferenceSearchPathFiles Include="..\..\Libs\**\*.dll">
      <InProject>false</InProject>
  </LibReferenceSearchPathFiles>
</ItemGroup>
<Target Name="BeforeResolveReferences">
  <RemoveDuplicates Inputs="@(LibReferenceSearchPathFiles->'%(RootDir)%(Directory)')">
    <Output TaskParameter="Filtered" ItemName="LibReferenceSearchPath" />
  </RemoveDuplicates>
  <CreateProperty Value="@(LibReferenceSearchPath);$(AssemblySearchPaths)">
    <Output TaskParameter="Value" PropertyName="AssemblySearchPaths" />
  </CreateProperty>
</Target>

Это позволяет загружать библиотеки DLL из подпапок библиотек. Если все dll находятся в корне папки Libs, то первый подстановочный знак можно удалить из значения "Включить".

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