【问题标题】:Telling *.csproj formats apart区分 *.csproj 格式
【发布时间】:2018-01-21 17:41:24
【问题描述】:

我有一个应用程序需要解析 *.csproj 文件中的 ProjectReference 元素。它可以很好地使用旧的 () 格式,我使用 Name 元素来获取项目的名称:

<ProjectReference Include="..\MyProject\MyProject.csproj">
  <Project>{guid..}</Project>
  <Name>MyProject</Name>
</ProjectReference>

然而,新格式 () 使它现在崩溃,因为不再有 Name 元素。

我发现两个文件之间存在一些差异,但我不确定应该使用哪一个来说明我正在使用新的核心文件。区别在于:

  • 新格式不包含xml声明
  • 根元素以&lt;Project Sdk= 属性开头,并且不包含任何默认命名空间,旧的命名空间已声明xmlns="
  • ProjectReference 元素不包含任何子元素

像 Visual Studio 那样识别核心文件的最可靠方法是哪个属性?我是在正确的轨道上还是我应该使用任何其他标准来区分文件格式?

【问题讨论】:

  • 为什么不直接从目标项目文件中取名字呢?这两种类型都适用。
  • @DavidG 是的,这肯定会起作用,我实际上可能会在以后实现它,但我仍然想知道如何正确识别新文件,以防我以后需要一些其他信息和在两个不同的模块中实现它。
  • 在那种情况下,我可能会使用 Project Sdk。
  • SDK 还可用于从 VS 15.6+ 中的 NuGet 解析任意 MSBuild sdk,即使对于经典项目也是如此。

标签: .net .net-core c# .net xml visual-studio-2017 .net-core


【解决方案1】:

如果您使用 MSBuild 评估项目文件,SDK 会将 UsingMicrosoftNETSdk 属性设置为 true

如果您只使用基于 XML 的工具来读取文件,您可以检查 &lt;TargetFramework&gt;&lt;TargetFrameworks&gt;(复数)属性(在 &lt;PropertyGroup&gt; 内)。

这与 Visual Studio 用于确定项目是使用新项目系统还是经典项目系统的机制相同(请参阅Opening With CPS 文档)。

【讨论】:

  • 对不起,我应该提到我正在使用XDocument 来阅读它。这绝对是识别新格式的最佳方式。只是出于好奇,我将如何使用 MSBuild 来获取这样的列表?我没有看到任何可以做到这一点的开关。
  • 例如使用 msbuild (Microsoft.Build.*) nuget 包及其 api,但这设置起来相当复杂。在静态评估期间在项目上设置属性。
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 2018-11-03
  • 2010-10-13
  • 1970-01-01
相关资源
最近更新 更多