2014-10-27 5 views
6

Voglio confrontare la versione del software creata in 3.5 con quella precedente. Se provo a confrontare la versione in 4.0, è facile usando Version.Parse ma nella versione precedente questa funzione non è presente. Ho provato a confrontarlo usando il confronto delle stringhe ma non riesco ancora a ottenere l'output desiderato perché il confronto delle stringhe non mi permette di confrontare con la versione minore o la versione principale. Grazie in anticipo.Come convertire la stringa in versione in .net 3.5?

risposta

2

mi sono imbattuto in un problema simile - ho dovuto analizzare e ordinare numeri di build in modo che potessero essere visualizzate all'utente in ordine decrescente. Ho finito per scrivere la mia classe per racchiudere le parti di un numero di build e ho implementato IComparable per l'ordinamento. Inoltre ha finito per sovraccaricare gli operatori maggiore di e inferiore a quello, così come il metodo Equals. Penso che abbia la maggior parte delle funzionalità della classe Version, tranne MajorRevision e MinorRevision, che non ho mai usato.

In effetti, potresti probabilmente rinominarlo in "Versione" e usarlo esattamente come hai fatto con la classe "reale".

Ecco il codice:

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

Si può sempre provare a decompilare la classe di versione .NET 4.0 - si potrebbe essere fortunati, funziona solo in .NET 3.5.

Altrimenti dovresti esaminare le stringhe spezzate o le espressioni regolari.

+0

dispiace dirlo che ci sono solo due metodi associati alla versione ma non un tipo di metodo di analisi. Il secondo metodo vale la pena provare ma richiede più codice. –

1

Sembra che tu stia chiedendo come ottenere le versioni di qualsiasi installazione .NET locale. MSDN ha un articolo su questo: http://msdn.microsoft.com/en-us/library/hh925568%28v=vs.110%29.aspx.

Essi includono la seguente funzione in esso:

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

        } 

       } 

      } 
     } 
    } 
}