【问题标题】:How can I get the assembly version as a integer in C#?如何在 C# 中将程序集版本作为整数获取?
【发布时间】:2010-11-02 04:49:43
【问题描述】:

我可以将它作为字符串获取:

Assembly.GetExecutingAssembly().GetName().Version()  

如何将此数字转换为 int?


示例输入:

8.0.0.1

预期输出:

8001

【问题讨论】:

  • 第一步 - 你得到的字符串是什么?
  • 它实际上是一个多部分的值。您应该会看到类似 1.0.3.4 的内容。如何将其显示为整数是非常随意的
  • 你必须问自己你想要大版本还是小版本?
  • 这就是我的想法,我打算让提问者得出结论
  • 想想案例 8.1.11.0 和 8.11.1.0

标签: c# .net


【解决方案1】:

如果您确实必须进行这种转换,您至少应该为每个版本部分保留足够数量的数字

Major、Minor 和 Revision 两位数,Build 两位数:

var version = Assembly.GetExecutingAssembly().GetName().Version();

Debug.Assert(version.Major >= 0 && version.Major < 100)
Debug.Assert(version.Minor >= 0 && version.Minor < 100)
Debug.Assert(version.Build >= 0 && version.Build < 10000)
Debug.Assert(version.Revision >= 0 && version.Revision < 100)

long longVersion = version.Major * 100000000L + 
                   version.Minor * 1000000L + 
                   version.Build * 100L + 
                   version.Revision;

int intVersion  = (int) longVersion;

Debug.Assert((long)intVersion == longVersion)

请注意,对于某些外来版本,此方法仍然会失败!

甚至不要考虑版本 21.47.4836.48 :)

编辑:添加了断言。

【讨论】:

  • +1 用于使用 Major/Minor/Build/Revision 属性,而不是解析版本字符串。正如您指出的那样,它可能会因大量数据而失败(包括溢出)。
【解决方案2】:

它们是数字,因此您可以将它们转换为字符串并彼此堆叠:

Version v = Assembly.GetExecutingAssembly().GetName().Version;
string compacted = string.Format("{0}{1}{2}{3}", v.Major, v.Minor, v.Build, v.Revision);
int compactInt = int.Parse(compacted);

这当然只有在每个组件少于十个时才有效。之后,您无法确定实际版本是什么。字符串“12345”可以是 1.23.4.5 或 12.3.4.5 或 1.2.34.5 或...

如果你知道他们都在十以下,你可以用数字来做:

Version v = Assembly.GetExecutingAssembly().GetName().Version;
int compactInt = v.Major * 1000 + v.Minor * 100 + v.Build * 10 + v.Revision;

如果你不知道,它会变得有点复杂,但你仍然可以在不创建字符串并解析它的情况下完成它。它会快一点,但它是 10 - 20 行代码。

【讨论】:

    【解决方案3】:

    另一种选择是将其视为 4 字节整数。对于每个版本部分(主要、次要、构建、修订),您将被限制为 0-255 的值,但您可以将版本打包成一个整数值。

    这可以防止 8.10.0.0 大于 9.0.0.0 (81,000 > 9,000) 的问题。

        /// <summary>
        ///  
        /// Converts a version string in the format of 
        /// [major].[minor].[build].[revision] into an integer.
        ///  
        /// </summary>
        /// <remarks>
        /// Each part of the build number must be within the range of 0 to 255.
        /// </remarks>
        /// <param name="version"> The version to convert to an integer. </param>
        /// <returns>
        /// The integer representation of the <paramref name="version"/>.
        /// </returns>
        public static int VersionToInt( string version ) {
            // Parse version number
            var versionParts = version.Split( '.' );
            if ( versionParts.Length != 4 ) {
                throw new ArgumentException( "Invalid version number; invalid number of version parts, expected 4 (major.minor.build.revision)",
                                             "version" );
            }
    
            // Convert parts to bytes
            byte major, minor, build, revision;
            if ( !byte.TryParse( versionParts[0], out major ) ) {
                throw new ArgumentException( "Invalid version number; invalid major number", 
                                             "version" );
            }
            if ( !byte.TryParse( versionParts[1], out minor ) ) {
                throw new ArgumentException( "Invalid version number; invalid minor number",
                                             "version" );
            }
            if ( !byte.TryParse( versionParts[2], out build ) ) {
                throw new ArgumentException( "Invalid version number; invalid build number", 
                                             "version" );
            }
            if ( !byte.TryParse( versionParts[3], out revision ) ) {
                throw new ArgumentException( "Invalid version number; invalid revision number", 
                                             "version" );
            }
    
            // Combine bytes into an integer
            var versionInteger = 0;
            versionInteger |= major << 24;
            versionInteger |= minor << 16;
            versionInteger |= build << 8;
            versionInteger |= revision;
    
            return versionInteger;
        }
    

    【讨论】:

    • 这在处理基于整数且不能超过 2100000000 的 VSTS 版本号和Android VersionCodes 时非常有用。所有其他示例仅使用第 4 版部分 - 但是如果您有 ALM 分支策略,这对 Android 不利!
    【解决方案4】:

    你可以 string.Split('.'), iterate 和 int.parse()

    【讨论】:

    • +1 用于拆分。这将使您可以根据需要格式化最终结果,因为您似乎特别关注最终整数的外观。
    【解决方案5】:

    以下“有效”:

    string version = "8.0.0.1";
    int versionNumber = int.Parse(version.Replace(".", ""));
    

    但是,版本 8.0.11.0 和 8.0.1.10 之间没有区别!

    【讨论】:

    • 谢谢,我刚刚意识到我需要在次要专业方面......我基本上需要将8.0.1.0转换为801000
    • 类似的东西?字符串版本=“9.0.1.0”; int versionNumber = int.Parse(version+"0.0".Replace(".", ""));
    【解决方案6】:

    您还可能遇到程序集的版本为 0.0.1.1 的情况,然后版本看起来像:11. 绝对不需要。

    【讨论】:

      【解决方案7】:

      我会这样做:

      Integer.Parse(Assembly.GetExecutingAssembly().GetName().Version().ToString().Replace(".", ""))
      

      我的立场是正确的。

      【讨论】:

      • 您不能将字符串转换为 int。你必须解析它。 Int.Parse 或 Convert.ToInt32 可以做到这一点。
      • 你不能只去掉“。”字符,因为例如(正如 AdamRalph 和可能其他人指出的那样)从版本 8.1.11.0 和版本 8.11.1.0 中删除句点将产生相同的整数值:81110
      【解决方案8】:

      试试这个:

      Version v = Assembly.GetExecutingAssembly().GetName().Version;
      long s = long.Parse(v.Major.ToString("0000") + v.MajorRevision.ToString("0000") + v.Minor.ToString("0000") + v.MinorRevision.ToString("0000"));
      

      【讨论】:

        【解决方案9】:

        您要解决的问题是什么?您是否正在检查某个库的运行版本是否大于或等于某个已知的无错误版本?如果是这样,正确的做法是不要将 . 分隔的数字字符串视为单个数字,而是将它们分别与您的目标进行比较。

        【讨论】:

        • 在这种情况下,您可以只比较版本对象。比较运算符被重载以处理版本对象。
        【解决方案10】:

        而不是这种方法,并假设您的每个版本字符串元素小于 255,您可以将每个元素作为 32 位无符号整数中的一个字节。这不会是人类可读的,但会确保如果 V1

        【讨论】:

        • Build 在大多数情况下是 4 位数。
        • 在这种情况下,我们可以从主要/次要中提取几个位来将构建范围扩展到 2^14 奇数。
        【解决方案11】:
        // assuming v is Version
        var versionNumber = long.Parse(v.Major.ToString("x2") + v.Minor.ToString("x2") + v.Build.ToString("x2"), Globalization.NumberStyles.HexNumber);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-28
          • 2020-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多