.csproj 如何知道它的解决方案?

How can .csproj know about its solution?

在 .csproj 文件中,您可以使用 $(SolutionDir) 等变量。可以通过这种方式找到图书馆。

你怎么可能通过 msbuild 构建 .csproj(不给它解决方案路径)?我看不出这种行为有任何意义,但它仍然有效。

单个项目文件知道它们属于哪个解决方案。变量 $(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 文件,然后您将 运行 进入构建中断。