2014-10-27 51 views
6

我想比較3.5中創建的軟件版本和舊版本。如果我嘗試在4.0中比較版本,那麼使用Version.Parse很容易,但在早期版本中,此工具不在那裏。我試圖通過使用字符串比較來比較它,但仍然無法獲得所需的輸出,因爲字符串比較不允許我與次要版本或主要版本進行比較。提前致謝。如何將字符串轉換爲.net 3.5中的版本?

回答

2

我遇到了類似的問題 - 我不得不解析和分類建立號碼,以便他們可以顯示降序排列的用戶。我最終編寫了自己的類來包裝構建編號的各個部分,並實現了用於排序的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; 
     } 
    } 
} 
1

您可以隨時嘗試反編譯.NET 4.0版本類 - 您可能很幸運,它只適用於.NET 3.5。

否則,你應該看看字符串拆分或正則表達式。

+0

遺憾地說,它只有兩個與版本相關的方法,但沒有解析方法。第二種方法值得嘗試,但它需要更多的代碼。 – 2014-10-27 05:34:58

1

你似乎在問如何獲取任何本地.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); 
         } 

        } 

       } 

      } 
     } 
    } 
} 
相關問題