$(ProjectName)和$(TargetName) MSBuild宏无法正常工作

6
我正在使用Visual Studio 2015 Community版。我已经加载了一个C#项目,想要配置它以使用影子构建,这样源文件就不会与任何二进制或中间生成的文件混在一起。尝试使用VS UI设置C#项目的[output]/[intermediate output]目录路径 - 唯一可编辑的UI输出路径是“bin”,它不接受MSBuild宏。然后我卸载了该项目并手动编辑了它。还设置了IntermediateOutputPath,在使用C#项目时,它在VS UI中不可用,但是在使用C++项目时,所有此类目录都是可编辑的。 当前,OutputPath设置为: <OutputPath>$(SolutionDir)..\build_$(SolutionName)_$(Configuration)_$(Platform)\$(ProjectName)</OutputPath>

$(ProjectName)因某种原因为空。尝试$(TargetName)(虽然这样做不正确,但只是为了测试),但它也为空。有什么建议吗?


1
不要使用 $(ProjectDir),而是使用 $(MSBuildProjectDir) - Peter Mortensen
2个回答

3

不要尝试导入Microsoft.CSharp.targets - 就像另一个答案所建议的那样。 首先 - 这将导致额外的警告。

Warning MSB4011: "Microsoft.CSharp.targets" cannot be imported again. ...

但是除此之外,在尝试编辑预/后构建时,Visual Studio也会崩溃。 (观察于Visual Studio 2019,版本16.7.7)

最好使用$(MSBuildProjectName)宏代替$(ProjectName) - 功能完全相同。


2
问题在于,一些 MSBuild 属性(如 ProjectName)在 .csproj 文件中的以下行之后设置。
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

在这行代码之后,您可以访问所有变量。


反过来,这个文件依赖于其他属性的设置,例如OutputPath。这些属性由项目文件中的多个PropertyGroup标签设置,每个标签对应一个项目配置(configuration|platform)。因此,这些必须首先设置,然后是导入,最后是定义后期构建事件的PropertyGroup - Florian Winter
1
@PeterMortensen:你的评论应该是答案。 - g.pickardou
同意。@PeterMortensen 请考虑将您的评论提升为实际答案。 - julealgon
错误 MSB3644:未找到 .NET Framework 版本为 v4.0 的参考程序集。要解决此问题,请安装此框架版本的开发人员包(SDK/Targeting Pack)或重新定向您的应用程序。您可以在 https://aka.ms/msbuild/developerpacks 下载 .NET Framework 开发人员包。 - Andrei Krasutski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接