2014-10-27 3 views
6

Ich möchte die in Version 3.5 erstellte Softwareversion mit der älteren Version vergleichen. Wenn ich versuche, Version in 4.0 zu vergleichen, dann ist es einfach, Version.Parse zu verwenden, aber in der früheren Version ist diese Einrichtung nicht da. Ich habe versucht, es zu vergleichen, indem ich Zeichenkettenvergleich benutze, aber immer noch nicht in der Lage bin, die gewünschte Ausgabe zu erhalten, weil der Vergleich der Zeichenfolgen es mir nicht erlaubt, mit der Nebenversion oder Hauptversion zu vergleichen. Danke im Voraus.Wie konvertiert man String in Version in .net 3.5?

Antwort

2

ich in ein ähnliches Problem lief - ich hatte zu analysieren und sortieren Zahlen zu bauen, so dass sie in absteigender Reihenfolge für den Benutzer angezeigt werden. Ich schrieb meine eigene Klasse, um die Teile einer Build-Nummer zu umschließen, und implementierte IComparable zum Sortieren. Es endete auch die Über-und Unter-Operatoren, sowie die Equals Methode überladen. Ich denke, dass es die meiste Funktionalität der Versionsklasse außer MajorRevision und MinorRevision hat, die ich nie verwendete.

In der Tat könnten Sie es wahrscheinlich in "Version" umbenennen und es genauso verwenden, wie Sie es mit der "echten" Klasse getan haben.

Hier ist der Code:

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

Sie könnten immer versuchen, die .NET 4.0-Version Klasse zu dekompilieren - Sie könnten glücklich sein, dass es einfach in .NET 3.5 funktioniert.

Andernfalls sollten Sie in String Split oder reguläre Ausdrücke suchen.

+0

leider sagen Dass es nur zwei Methoden gibt, die mit der Version verknüpft sind, aber keine Methode, die Art von Parse ist. Die zweite Methode ist einen Versuch wert, erfordert aber mehr Code. –

1

Es scheint so, als würden Sie nach den Versionen aller lokalen .NET-Installationen fragen. MSDN hat einen Artikel darüber: http://msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx.

Dazu gehören folgende Funktion darin:

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); 
         } 

        } 

       } 

      } 
     } 
    } 
} 
Verwandte Themen