2014-10-27 12 views
6

Chcę porównać wersję oprogramowania utworzoną w wersji 3.5 ze starszą. Jeśli próbuję porównać wersję w wersji 4.0, to jest to łatwe przy użyciu Version.Parse, ale we wcześniejszej wersji tego obiektu nie ma. Próbowałem go porównać przy użyciu porównania ciągów, ale nadal nie można uzyskać pożądanego wyniku, ponieważ porównywanie ciągów nie pozwala mi na porównanie z wersją drugorzędną lub główną. Z góry dziękuję.Jak przekonwertować ciąg na wersję w .net 3.5?

Odpowiedz

2

wpadłem na podobny problem - miałem do analizowania i rodzaj budowy numerów więc mogą one być wyświetlane użytkownikowi w kolejności malejącej. W końcu napisałem własną klasę, aby opakować części numeru kompilacji i zaimplementowałem IComparable do sortowania. Również skończyło się przeciążaniem operatorów większych i niższych, a także metodą Equals. Myślę, że ma większość funkcjonalności klasy Version, z wyjątkiem MajorRevision i MinorRevision, z których nigdy nie korzystałem.

W rzeczywistości prawdopodobnie można zmienić nazwę na "Wersja" i używać go dokładnie tak samo jak w przypadku "prawdziwej" klasy.

Oto kod:

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

Zawsze można próbować dekompilować klasę .NET 4.0 - możesz mieć szczęście, że działa po prostu w .NET 3.5.

W przeciwnym razie należy sprawdzić podział na łańcuchy lub wyrażenia regularne.

+0

Niestety do powiedzenia To ma tylko dwie metody związane z Wersją, ale nie jest to rodzaj analizy Parse. Druga metoda jest warta próby, ale wymaga więcej kodu. –

1

Wygląda na to, że pytasz o to, jak uzyskać wersje lokalnych instalacji .NET. MSDN ma artykuł na ten temat: http://msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx.

Obejmują one następujące funkcje w nim:

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

        } 

       } 

      } 
     } 
    } 
} 
Powiązane problemy