我的所有.NET程序集都使用1.0。*格式作为其版本号。据说*被当前的日期和时间取代,翻译成一个数字。将其转换回日期和时间的公式是什么?
答案 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以来的天数 随机,指定开始日期和 基于数量的修订 从午夜开始的几秒钟。
这里的关键是“随机”。因此,您可以将修订版翻译成一天中的某个时间,但听起来您无法将其解析为某个日期。
答案 2 :(得分:2)
根据MSDN:“默认内部版本号每天递增。默认版本号是随机的。”
如果你看一下反射器中AssemblyVersionAttribute
的来源,你会发现它根本没有做任何事情,只是接受了字符串。所以魔术就发生在编译器本身,据我所知,在任何地方都没有记录。 “每天增加”是非常模糊的,从什么点开始?
我不希望能够以任何可靠性使用这些版本。最好将你的版本基于源控制系统中的标签或类似的东西。
答案 3 :(得分:1)
在Roslyn和.NET Core中,编译器源代码现已可用。
文件roslyn/src/Compilers/Core/Portable/VersionHelper.cs
(https://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步骤来修改版本号。这是我在需要实现此功能时经常回访的帖子。
基本上,在MSBUILD proj文件中,您可以在AssemblyInfo文件上创建转换。类似的东西:
<ItemGroup>
<RegexTransform Include="$(SolutionRoot)\CommonAssemblyInfo.cs">
<Find>(?<major>\d+)\.(?<minor>\d+)\.\d+\.(?<revision>\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();
}