Как.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 с другим подмножеством ваших проектов в другом каталоге, а затем вы столкнетесь с перерывами в строительстве.

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