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

时间:2009-11-19 22:20:53

标签: .net

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

9 个答案:

答案 0 :(得分:16)

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

var result = new DateTime(2000, 1, 1);
result = result.AddDays(buildNumber);
result = result.AddSeconds(revision * 2);

然而,正如其他人已经指出的那样,文件并不能保证情况永远如此。

答案 1 :(得分:2)

版本字符串具有以下格式:

<major version>.<minor version>.<build number>.<revision>

如果您按照自己的描述设置版本,则转到1.0.*

  

结果是内部版本号   设置为自a以来的天数   随机,指定开始日期和   基于数量的修订   从午夜开始的几秒钟。

这里的关键是“随机”。因此,您可以将修订版翻译成一天中的某个时间,但听起来您无法将其解析为某个日期。

http://msdn.microsoft.com/en-us/library/ms998223.aspx

答案 2 :(得分:2)

根据MSDN:“默认内部版本号每天递增。默认版本号是随机的。”

如果你看一下反射器中AssemblyVersionAttribute的来源,你会发现它根本没有做任何事情,只是接受了字符串。所以魔术就发生在编译器本身,据我所知,在任何地方都没有记录。 “每天增加”是非常模糊的,从什么点开始?

我不希望能够以任何可靠性使用这些版本。最好将你的版本基于源控制系统中的标签或类似的东西。

答案 3 :(得分:1)

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

文件roslyn/src/Compilers/Core/Portable/VersionHelper.cshttps://github.com/dotnet/roslyn/blob/614299ff83da9959fa07131c6d0ffbc58873b6ae/src/Compilers/Core/Portable/VersionHelper.cs - 来自提交4f44984 on 2016-04-19)与方法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);

然而,文档评论只是简单地说“基于时间的价值”而没有具体说明它是如何生成的。

但事实上,到目前为止,Build仍然是自2000-01-01以来的几天,而Revision自午夜以来的秒数。

有趣的是,VersionHelperTests.cs中的测试用例中定义并验证了此行为 https://github.com/dotnet/roslyn/blob/614299ff83da9959fa07131c6d0ffbc58873b6ae/src/Compilers/Core/CodeAnalysisTest/VersionHelperTests.cs

答案 4 :(得分:0)

此处记录了程序集版本控制:http://msdn.microsoft.com/en-us/library/51ket42z.aspx

从下面的引文中,我会说你问的是不可能的,而且你的信息不正确。

  

装配版本号每个装配   有一个版本号作为其一部分   身份。因此,两个组件   因版本号而异   运行时认为是   完全不同的组件。这个   版本号是物理的   表示为四部分字符串   格式如下:

<major version>.<minor version>.<build> number>.<revision>

但是,在我链接的页面底部,有关于自定义程序集属性的信息和设置程序集属性的链接。你可以在那里找到有用的东西。 编辑 - 已添加<​​/ em>

我看了你在评论的答案中发布的链接,我唯一看到的是:

  

结果是内部版本号   设置为自a以来的天数   随机,指定开始日期和   基于数量的修订   从午夜开始的几秒钟。

基于它说“随机指定的开始日期”的事实,我会说如果你能弄清楚随机指定的开始日期是什么,你可能会问,但我怀疑这是值得的努力找出答案。

用于编码最佳协议的无耻插件

您可以更好地使用修订控制和自动构建过程,并使用这些过程中的日志来确定组件的构建日期。

答案 5 :(得分:0)

即使您可以从自动生成的内部版本号计算日期/时间,我也不会推荐它。内部版本号不是为了这个目的。它只是一个自动生成的值,您可以依赖它来不断增加。消费应用程序不应该采用进一步的逻辑。如果您希望版本号的片段包含日期/时间戳,那么您应该将该逻辑集成到构建过程/脚本中,否则您可以选择这样做。

答案 6 :(得分:0)

我在AssemblyInfo.cs上调用UpdateVersion的程序集上使用PostBuild脚本

我们对版本使用以下格式|年|月|日| BuildCounter |。

由于更新版本是开源的,您可以修改它以适应。

我已将其修改为使用当前日期和每个构建增加的计数器。

这样版本号总是会改变,我可以从版本号中得出日期。

非常方便。

答案 7 :(得分:0)

旧帖子,但希望这将提供另一个(简单)选项来更新版本号。我使用MSBUILD RegexTransform步骤来修改版本号。这是我在需要实现此功能时经常回访的帖子。

http://weblogs.asp.net/srkirkland/archive/2010/12/07/simple-msbuild-configuration-updating-assemblies-with-a-version-number.aspx

基本上,在MSBUILD proj文件中,您可以在AssemblyInfo文件上创建转换。类似的东西:

<ItemGroup>
    <RegexTransform Include="$(SolutionRoot)\CommonAssemblyInfo.cs">
        <Find>(?&lt;major&gt;\d+)\.(?&lt;minor&gt;\d+)\.\d+\.(?&lt;revision&gt;\d+)</Find>
        <ReplaceWith>$(BUILD_NUMBER)</ReplaceWith>
    </RegexTransform>
</ItemGroup>

从外部提供BUILD_NUMBER:

msbuild myBuild.proj /p:Configuration="%config%" /p:build_number="%version%"

答案 8 :(得分:0)

/* Use this method */

/// <summary>
/// Gets the Assembly build date in string format
/// </summary>
/// <param name="assemblyVersion"></param>
/// <param name="dateFormat"></param>
/// <returns></returns>
private static string GetAssemblyBuildDate(string assemblyVersion,string dateFormat = "")
{
    DateTime buildDate = new DateTime(2000, 1, 1);

    Version currentAssemblyVersion = Version.Parse(assemblyVersion);

    buildDate = buildDate.AddDays(currentAssemblyVersion.Build);

    buildDate = buildDate.AddSeconds(currentAssemblyVersion.Revision * 2);

    return string.IsNullOrEmpty(dateFormat) == false ? buildDate.ToString(dateFormat) : buildDate.ToString();
}