2012-06-18 13 views
10

Wie kann ich überprüfen/erkennen, welche Visual Studio-Version unter meinem VSPackage ausgeführt wird?Erkennen der Visual Studio-Version in einem VSPackage

Ich kann nicht aus der Registrierung erhalten, weil der Computer mehrere Versionen installiert haben könnte, so dass ich denke, es ist eine API, die es zu erhalten vermag.

Jeder weiß, wie man es aus einem verwalteten Visual Studio-Paket mit C# bekommt?

Antwort

8

Schließlich finden schrieb ich eine Klasse, die Visual Studio-Version zu erkennen. Getestet und Arbeiten:

public static class VSVersion 
{ 
    static readonly object mLock = new object(); 
    static Version mVsVersion; 
    static Version mOsVersion; 

    public static Version FullVersion 
    { 
     get 
     { 
      lock (mLock) 
      { 
       if (mVsVersion == null) 
       { 
        string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "msenv.dll"); 

        if (File.Exists(path)) 
        { 
         FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(path); 

         string verName = fvi.ProductVersion; 

         for (int i = 0; i < verName.Length; i++) 
         { 
          if (!char.IsDigit(verName, i) && verName[i] != '.') 
          { 
           verName = verName.Substring(0, i); 
           break; 
          } 
         } 
         mVsVersion = new Version(verName); 
        } 
        else 
         mVsVersion = new Version(0, 0); // Not running inside Visual Studio! 
       } 
      } 

      return mVsVersion; 
     } 
    } 

    public static Version OSVersion 
    { 
     get { return mOsVersion ?? (mOsVersion = Environment.OSVersion.Version); } 
    } 

    public static bool VS2012OrLater 
    { 
     get { return FullVersion >= new Version(11, 0); } 
    } 

    public static bool VS2010OrLater 
    { 
     get { return FullVersion >= new Version(10, 0); } 
    } 

    public static bool VS2008OrOlder 
    { 
     get { return FullVersion < new Version(9, 0); } 
    } 

    public static bool VS2005 
    { 
     get { return FullVersion.Major == 8; } 
    } 

    public static bool VS2008 
    { 
     get { return FullVersion.Major == 9; } 
    } 

    public static bool VS2010 
    { 
     get { return FullVersion.Major == 10; } 
    } 

    public static bool VS2012 
    { 
     get { return FullVersion.Major == 11; } 
    } 
} 
+0

Diese Lösung ist im Vergleich zu DTE.Version sinnvoll, da früher oder später DTE von VS API veraltet wird (genauso wie die VS-Addin-Technologie veraltet ist). Der vorgeschlagene Code kann verbessert werden, indem fvi.FileMajorPart und fvi.FileMinorPart verwendet werden, das zwei Ganzzahlen zurückgibt. Dadurch wird der String-Parsing-Teil im vorgeschlagenen Code vermieden. –

+0

+1, da dieser Code die Vollversion (z. B. 11.0.61030.00) abruft, die zum Ableiten der Aktualisierungsstufe von VS verwendet werden kann. DTE.Version kehrt nur z. "11.0" –

+0

Gibt es einen Grund, msenv.dll gegenüber devenv.exe vorzuziehen? Nur neugierig. Außerdem: frage mich, ob wirklich eine Verriegelung erforderlich ist? –

14

könnten Sie versuchen, Versionüber Automatisierung DTE-Objekt zu erhalten. In MPF ​​könnte man es auf diese Weise erhalten:

EnvDTE.DTE dte = (EnvDTE.DTE)Package.GetGlobalService(typeof(EnvDTE.DTE)); 

Es gibt einige andere ähnliche Dinge DTE-Objekt abzurufen - über Project.DTE, lesen Sie auch this thread wenn Sie null für DTE bekommen.

Dann können Sie die Version mit DTE.Version property erhalten.

auch nützliche Informationen könnten auf Carlos Quintero (VS Addin ninja) Webseite HOWTO: Detect installed Visual Studio editions, packages or service packs

+0

für Visual Studio 2010 diese Eigenschaft gibt "10.0" und "12.0" für Visual Studio 2013 – Wolf5

+0

Ist es möglich, zu erhalten VS Update-Nummer (zB Update 3) mit DTE? – Bandara

2

Ich denke, der folgende Code ist besser:

string version = ((EnvDTE.DTE) ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE.DTE).GUID)).Version;