C# 如何获得.csproj文件中两个日期之间的差异?

C# 如何获得.csproj文件中两个日期之间的差异?,c#,.net,visual-studio,msbuild,csproj,C#,.net,Visual Studio,Msbuild,Csproj,我在csproj文件中看到了一些 $([System.DateTime]::UtcNow.ToString(mmff)) 要自动增加程序集版本,请执行以下操作: <VersionSuffix>2.0.0.$([System.DateTime]::UtcNow.ToString(mmff))</VersionSuffix> <AssemblyVersion Condition=" '$(VersionSuffix)' == '' ">0.0

我在csproj文件中看到了一些

$([System.DateTime]::UtcNow.ToString(mmff))
要自动增加程序集版本,请执行以下操作:

<VersionSuffix>2.0.0.$([System.DateTime]::UtcNow.ToString(mmff))</VersionSuffix>
<AssemblyVersion Condition=" '$(VersionSuffix)' == '' ">0.0.0.1</AssemblyVersion>
2.0.0.$([System.DateTime]::UtcNow.ToString(mmff))
0.0.0.1
那是什么样的语言/脚本?我如何使用它来获得两个日期之间的差异

我试着这样做:

<VersionMajor>2</VersionMajor>
<VersionMinor>1</VersionMinor>
<DaysFromLastRelease>$(([System.DateTime]::UtcNow - new [System.DateTime](2021,1,1))::TotalDays)</DaysFromLastRelease>
2
1.
$([System.DateTime]::UtcNow-new[System.DateTime](2021,1,1))::TotalDays)

但是它不起作用:)

.csproj
文件基本上就是文件(XML)。您所指的嵌入式语法称为

似乎不支持使用减号(
-
)进行减法运算。中有一个
Subtract()
属性函数

也许这可以作为解决方案的基础。我没有试过

<Now>$([System.DateTime]::UtcNow.DayOfYear)</Now>

<January>$([System.DateTime]::new(2021,1,1)).DayOfYear</January>
<!-- or... (not sure about the below)
<January>$([System.DateTime]::Parse("1/1/2021").DayOfYear)</January>
 -->

<DaysFromLastRelease>$([MSBuild]::Subtract($(Now), $(January)))</DaysFromLastRelease>
$([System.DateTime]::UtcNow.DayOfYear)
$([System.DateTime]::新建(2021,1,1)).DayOfYear
$([MSBuild]::减去($(现在),$(一月)))
其他可能性

  • 通过编写MSBuild任务来计算日期差
  • 调用您编写的简单程序
  • 以某种方式使用外部程序设置环境变量,然后在
    .csproj

它不是一种语言。文件是只读的,并且是XML格式。OP所说的是嵌入式表达式,如
[System.DateTime]::UtcNow.ToString(mmff)
。看起来有点像PowerShellI不建议使用时间来生成版本号。它可以破坏MSBuild的增量构建模型并产生更长的构建时间。它使用git的提交信息而不是时间
new DateTime
可以用作例如
$([System.DateTime]::new(2021,1,1))
@Renat。我将补充我的答案。谢谢。这是由.NET平台的任何编译器(Framework和/或Core,Mono…)支持的,还是仅限于Visual Studio?@OlivierRogier it's MSBuild,因此,它可能会在VS之外工作。基于这样一个事实,您有一个名为
DaysFromLastRelease
的节点,听起来您想计算
Now-LastBuildDate
,然后在几天内得到它,对吗?我在回答中提供的是硬编码的,所以我说这是一个基础,而不是一个完整的解决方案。完整的解决方案必须考虑诸如负值之类的异常情况。MSBuild虽然功能强大,但在您想要执行的操作中可能遇到了匹配项。。。不确定;)