using System; using System.Linq; using System.Reflection; namespace linker.libs { public static class VersionHelper { public static string version = $"v{string.Join(".", Assembly.GetEntryAssembly().GetName().Version.ToString().Split('.').Take(3))}"; /// /// 比较版本,相差多少 /// /// /// /// 是否取绝对值 /// 负整数 v1小于v2多少,0相等,正整数v1大于v2多少 public static int Compare(string v1, string v2, bool abs) { ReadOnlySpan v1Span = v1.AsSpan(); if (v1Span[0] == 'v') v1Span = v1Span.Slice(1); ReadOnlySpan v2Span = v2.AsSpan(); if (v2Span[0] == 'v') v2Span = v2Span.Slice(1); return Compare(Version.Parse(v1Span), Version.Parse(v2Span), abs); } /// /// 比较版本,相差多少 /// /// /// /// 是否取绝对值 /// 负整数 v1小于v2多少,0相等,正整数v1大于v2多少 public static int Compare(Version v1, Version v2, bool abs) { int v1Major = v1.Major; int v1Minor = v1.Minor; int v1Build = v1.Build; int v2Major = v2.Major; int v2Minor = v2.Minor; int v2Build = v2.Build; while (v1Major < 10000 && v1Major > 0) v1Major *= 10; while (v2Major < 10000 && v2Major > 0) v2Major *= 10; while (v1Minor < 1000 && v1Minor > 0) v1Minor *= 10; while (v2Minor < 1000 && v2Minor > 0) v2Minor *= 10; while (v1Build < 100 && v1Build > 0) v1Build *= 10; while (v2Build < 100 && v2Build > 0) v2Build *= 10; int value = (v1Major + v1Minor + v1Build) - (v2Major + v2Minor + v2Build); if (abs) { value = Math.Abs(value); } return value; } } }