我可以将.net程序集版本翻译成日期吗?

Jon*_*len 11 .net

我的所有.NET程序集都使用1.0.*格式作为其版本号.据说*被当前的日期和时间取代,翻译成一个数字.将其转换回日期和时间的公式是什么?

Phi*_*oss 19

在实践中,我发现内部版本号是自2000年1月1日以来的天数.修订版是从当天午夜开始的秒数除以2.

var result = new DateTime(2000, 1, 1);
result = result.AddDays(buildNumber);
result = result.AddSeconds(revision * 2);
Run Code Online (Sandbox Code Playgroud)

但是,正如其他人已经指出的那样,文档并不能保证始终如此.


Dai*_*Dai 5

在 Roslyn 和 .NET Core 中,编译器源代码现已可用。

该文件roslyn/src/Compilers/Core/Portable/VersionHelper.cshttps://github.com/dotnet/roslyn/blob/614299ff83da9959fa07131c6d0ffbc58873b6ae/src/Compilers/Core/Portable/VersionHelper.cs - 来自2016-04-19 的提交 4f44984)确实具有与原始文件相同的日期逻辑csc在方法中GenerateVersionFromPatternAndCurrentTime

int revision = (int)time.TimeOfDay.TotalSeconds / 2;

// 24 * 60 * 60 / 2 = 43200 < 65535
Debug.Assert(revision < ushort.MaxValue);

// ...

TimeSpan days = time.Date - new DateTime(2000, 1, 1);
int build = Math.Min(ushort.MaxValue, (int)days.TotalDays);

return new Version(pattern.Major, pattern.Minor, (ushort)build, (ushort)revision);
Run Code Online (Sandbox Code Playgroud)

然而,文档注释只是说“基于时间的值”,而没有具体说明它是如何生成的。

但事实上,到目前为止,这Build仍然是自 2000 年 1 月 1 日以来的天数,并且Revision是自午夜以来秒数的一半。

有趣的是,这种行为是在测试用例中定义和验证的VersionHelperTests.cshttps://github.com/dotnet/roslyn/blob/614299ff83da9959fa07131c6d0ffbc58873b6ae/src/Compilers/Core/CodeAnalysisTest/VersionHelperTests.cs