Как.csproj узнать о своем решении?
В файлах.csproj вы можете использовать такие переменные, как $(SolutionDir). Таким способом можно найти библиотеки.
Как это возможно, вы можете собрать.csproj с помощью msbuild (без указания пути решения)? Я не вижу никакого смысла в таком поведении, но оно все равно работает.
1 ответ
Отдельные файлы проекта не знают, в какое решение они входят. Переменные $(SolutionDir), $(SolutionPath), $(SolutionExt) и т. Д. Определены только при создании файла.sln, они не определяются при непосредственном создании проекта.
Чтобы проиллюстрировать это, поместите это в файл вашего проекта:
<Target Name="BeforeBuild">
<Message Text="SolutionDir=$(SolutionDir)" />
</Target>
Когда вы строите решение, вы получаете это:
>msbuild sln.sln
Microsoft (R) Build Engine version 12.0.31101.0
...
BeforeBuild:
SolutionDir=e:\temp\sln\
...
Когда вы строите свой проект напрямую, вы получаете это:
>msbuild fs\fs.fsproj
Microsoft (R) Build Engine version 12.0.31101.0
...
BeforeBuild:
SolutionDir=*Undefined*
...
Как видите, $(SolutionDir) сильно сломан. Я не рекомендую использовать его вместе с другими переменными $(Solution***), потому что в какой-то момент вы захотите создать проект напрямую или создать новый файл.sln с другим подмножеством ваших проектов в другом каталоге, а затем вы столкнетесь с перерывами в строительстве.