Использование одних и тех же ссылок на сборки в 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. Это в основном возможно в моем случае, но иногда есть внешние компоненты, где я не могу запросить такие модификации, поэтому я бы по возможности искал переопределение на уровне решения.
- Условный HintPath, основанный на проверке существования файла: .csproj несколько путей подсказок для сборки. Это может работать, поскольку в большинстве случаев структура решения здесь хорошо известна.
- Указание нескольких мест поиска сборок: /questions/47218718/hintpath-dlya-dobavlennoj-ssyilki-v-visual-studio/47218774#47218774
Спасибо.
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, то первый подстановочный знак можно удалить из значения "Включить".