.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 文件,然后您将 运行 进入构建中断。
在 .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 文件,然后您将 运行 进入构建中断。