如何将字符串转换为.net 3.5中的版本?

问题描述:

我想比较3.5中创建的软件版本和旧版本。如果我尝试在4.0中比较版本,那么使用Version.Parse很容易,但在早期版本中,此工具不在那里。我试图通过使用字符串比较来比较它,但仍然无法获得所需的输出,因为字符串比较不允许我与次要版本或主要版本进行比较。提前致谢。如何将字符串转换为.net 3.5中的版本?

我遇到了类似的问题 - 我不得不解析和分类建立号码,以便他们可以显示降序排列的用户。我最终编写了自己的类来包装构建编号的各个部分,并实现了用于排序的IComparable。也结束了超载和小于运营商,以及Equals方法。我认为它具有Version类的大部分功能,除了MajorRevision和MinorRevision之外,我从来没有使用它。

事实上,你可以将它重命名为'Version',并像使用'真实'类一样使用它。

下面的代码:

public class BuildNumber : IComparable 
{ 
    public int Major { get; private set; } 
    public int Minor { get; private set; } 
    public int Build { get; private set; } 
    public int Revision { get; private set; } 

    private BuildNumber() { } 

    public static bool TryParse(string input, out BuildNumber buildNumber) 
    { 
     try 
     { 
      buildNumber = Parse(input); 
      return true; 
     } 
     catch 
     { 
      buildNumber = null; 
      return false; 
     } 
    } 

    /// <summary> 
    /// Parses a build number string into a BuildNumber class 
    /// </summary> 
    /// <param name="buildNumber">The build number string to parse</param> 
    /// <returns>A new BuildNumber class set from the buildNumber string</returns> 
    /// <exception cref="ArgumentException">Thrown if there are less than 2 or 
    /// more than 4 version parts to the build number</exception> 
    /// <exception cref="FormatException">Thrown if string cannot be parsed 
    /// to a series of integers</exception> 
    /// <exception cref="ArgumentOutOfRangeException">Thrown if any version 
    /// integer is less than zero</exception> 
    public static BuildNumber Parse(string buildNumber) 
    { 
     if (buildNumber == null) throw new ArgumentNullException("buildNumber"); 

     var versions = buildNumber 
      .Split(new[] {'.'}, 
        StringSplitOptions.RemoveEmptyEntries) 
      .Select(v => v.Trim()) 
      .ToList(); 

     if (versions.Count < 2) 
     { 
      throw new ArgumentException("BuildNumber string was too short"); 
     } 

     if (versions.Count > 4) 
     { 
      throw new ArgumentException("BuildNumber string was too long"); 
     } 

     return new BuildNumber 
      { 
       Major = ParseVersion(versions[0]), 
       Minor = ParseVersion(versions[1]), 
       Build = versions.Count > 2 ? ParseVersion(versions[2]) : -1, 
       Revision = versions.Count > 3 ? ParseVersion(versions[3]) : -1 
      }; 
    } 

    private static int ParseVersion(string input) 
    { 
     int version; 

     if (!int.TryParse(input, out version)) 
     { 
      throw new FormatException(
       "buildNumber string was not in a correct format"); 
     } 

     if (version < 0) 
     { 
      throw new ArgumentOutOfRangeException(
       "buildNumber", 
       "Versions must be greater than or equal to zero"); 
     } 

     return version; 
    } 

    public override string ToString() 
    { 
     return string.Format("{0}.{1}{2}{3}", Major, Minor, 
          Build < 0 ? "" : "." + Build, 
          Revision < 0 ? "" : "." + Revision); 
    } 

    public int CompareTo(object obj) 
    { 
     if (obj == null) return 1; 
     var buildNumber = obj as BuildNumber; 
     if (buildNumber == null) return 1; 
     if (ReferenceEquals(this, buildNumber)) return 0; 

     return (Major == buildNumber.Major) 
        ? (Minor == buildNumber.Minor) 
         ? (Build == buildNumber.Build) 
           ? Revision.CompareTo(buildNumber.Revision) 
           : Build.CompareTo(buildNumber.Build) 
         : Minor.CompareTo(buildNumber.Minor) 
        : Major.CompareTo(buildNumber.Major); 
    } 

    public static bool operator >(BuildNumber first, BuildNumber second) 
    { 
     return (first.CompareTo(second) > 0); 
    } 

    public static bool operator <(BuildNumber first, BuildNumber second) 
    { 
     return (first.CompareTo(second) < 0); 
    } 

    public override bool Equals(object obj) 
    { 
     return (CompareTo(obj) == 0); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      var hash = 17; 
      hash = hash * 23 + Major.GetHashCode(); 
      hash = hash * 23 + Minor.GetHashCode(); 
      hash = hash * 23 + Build.GetHashCode(); 
      hash = hash * 23 + Revision.GetHashCode(); 
      return hash; 
     } 
    } 
} 

您可以随时尝试反编译.NET 4.0版本类 - 您可能很幸运,它只适用于.NET 3.5。

否则,你应该看看字符串拆分或正则表达式。

+0

遗憾地说,它只有两个与版本相关的方法,但没有解析方法。第二种方法值得尝试,但它需要更多的代码。 – 2014-10-27 05:34:58

你似乎在问如何获取任何本地.NET安装的版本。 MSDN有一篇关于此的文章:http://msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx

它们包括以下功能其中:

private static void GetVersionFromRegistry() 
{ 
    // Opens the registry key for the .NET Framework entry. 
     using (RegistryKey ndpKey = 
      RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, ""). 
      OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\")) 
     { 
      // As an alternative, if you know the computers you will query are running .NET Framework 4.5 
      // or later, you can use: 
      // using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, 
      // RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\")) 
     foreach (string versionKeyName in ndpKey.GetSubKeyNames()) 
     { 
      if (versionKeyName.StartsWith("v")) 
      { 

       RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName); 
       string name = (string)versionKey.GetValue("Version", ""); 
       string sp = versionKey.GetValue("SP", "").ToString(); 
       string install = versionKey.GetValue("Install", "").ToString(); 
       if (install == "") //no install info, must be later. 
        Console.WriteLine(versionKeyName + " " + name); 
       else 
       { 
        if (sp != "" && install == "1") 
        { 
         Console.WriteLine(versionKeyName + " " + name + " SP" + sp); 
        } 
       } 
       if (name != "") 
       { 
        continue; 
       } 
       foreach (string subKeyName in versionKey.GetSubKeyNames()) 
       { 
        RegistryKey subKey = versionKey.OpenSubKey(subKeyName); 
        name = (string)subKey.GetValue("Version", ""); 
        if (name != "") 
         sp = subKey.GetValue("SP", "").ToString(); 
        install = subKey.GetValue("Install", "").ToString(); 
        if (install == "") //no install info, must be later. 
         Console.WriteLine(versionKeyName + " " + name); 
        else 
        { 
         if (sp != "" && install == "1") 
         { 
          Console.WriteLine(" " + subKeyName + " " + name + " SP" + sp); 
         } 
         else if (install == "1") 
         { 
          Console.WriteLine(" " + subKeyName + " " + name); 
         } 

        } 

       } 

      } 
     } 
    } 
} 

原谅我,如果我在想念的东西,但你不能使用版本对象构造函数传递你的版本字符串:

http://msdn.microsoft.com/en-us/library/y0hf9t2e%28v=vs.90%29.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

​​