【问题标题】:$(ProjectName) and $(TargetName) MSBuild macros not working$(ProjectName) 和 $(TargetName) MSBuild 宏不起作用
【发布时间】:2015-10-14 13:38:31
【问题描述】:

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

$(ProjectName) 出于某种原因为空。试过$(TargetName)(使用它是不正确的,只是为了测试)但它也是空的。有什么建议吗?

【问题讨论】:

标签: c# msbuild visual-studio-2015


【解决方案1】:

问题是某些 MSBuild 属性(如 ProjectName)是在 .csproj 文件中的以下行之后设置的。

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

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

【讨论】:

  • 反过来,这个文件依赖于其他属性,例如OutputPath,要设置。这些由项目文件中的许多PropertyGroup 标记设置,每个项目配置(配置|平台)一个。所以这些必须先出现,然后是导入,然后是定义构建后事件的PropertyGroup
  • @PeterMortensen:您的评论应该是答案。
  • 同意。 @PeterMortensen 请考虑在此处将您的 cmets 推广为实际答案。
【解决方案2】:

不要尝试导入 Microsoft.CSharp.targets - 就像另一个答案中建议的那样。 首先 - 它会导致额外的警告,如

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

但除此之外,如果您尝试编辑构建前/构建后的 Visual Studio,则会崩溃。 (在 Visual Studio 2019 16.7.7 版本中观察到)

最好使用$(MSBuildProjectName) 宏而不是$(ProjectName) - 工作方式相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多