ProductionVersion.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System;
  2. using System.Reflection;
  3. using System.Text.RegularExpressions;
  4. namespace FastGithub.Upgrade
  5. {
  6. /// <summary>
  7. /// 表示产品版本
  8. /// </summary>
  9. public class ProductionVersion : IComparable<ProductionVersion>
  10. {
  11. /// <summary>
  12. /// 版本
  13. /// </summary>
  14. public Version Version { get; }
  15. /// <summary>
  16. /// 子版本
  17. /// </summary>
  18. public string SubVersion { get; }
  19. /// <summary>
  20. /// 产品版本
  21. /// </summary>
  22. /// <param name="version"></param>
  23. /// <param name="subVersion"></param>
  24. public ProductionVersion(Version version, string subVersion)
  25. {
  26. this.Version = version;
  27. this.SubVersion = subVersion;
  28. }
  29. /// <summary>
  30. /// 比较版本
  31. /// </summary>
  32. /// <param name="other"></param>
  33. /// <returns></returns>
  34. public int CompareTo(ProductionVersion? other)
  35. {
  36. var x = this;
  37. var y = other;
  38. if (y == null)
  39. {
  40. return 1;
  41. }
  42. var value = x.Version.CompareTo(y.Version);
  43. if (value == 0)
  44. {
  45. value = CompareSubVerson(x.SubVersion, y.SubVersion);
  46. }
  47. return value;
  48. static int CompareSubVerson(string subX, string subY)
  49. {
  50. if (subX.Length == 0 && subY.Length == 0)
  51. {
  52. return 0;
  53. }
  54. if (subX.Length == 0)
  55. {
  56. return 1;
  57. }
  58. if (subY.Length == 0)
  59. {
  60. return -1;
  61. }
  62. return StringComparer.OrdinalIgnoreCase.Compare(subX, subY);
  63. }
  64. }
  65. public override string ToString()
  66. {
  67. return $"{Version}{SubVersion}";
  68. }
  69. /// <summary>
  70. /// 解析
  71. /// </summary>
  72. /// <param name="productionVersion"></param>
  73. /// <returns></returns>
  74. public static ProductionVersion Parse(string productionVersion)
  75. {
  76. const string VERSION = @"^\d+\.(\d+.){0,2}\d+";
  77. var verion = Regex.Match(productionVersion, VERSION).Value;
  78. var subVersion = productionVersion[verion.Length..];
  79. return new ProductionVersion(Version.Parse(verion), subVersion);
  80. }
  81. /// <summary>
  82. /// 获取当前应用程序的产品版本
  83. /// </summary>
  84. /// <returns></returns>
  85. public static ProductionVersion? GetAppVersion()
  86. {
  87. var version = Assembly
  88. .GetEntryAssembly()?
  89. .GetCustomAttribute<AssemblyInformationalVersionAttribute>()?
  90. .InformationalVersion;
  91. return version == null ? null : Parse(version);
  92. }
  93. }
  94. }