2012-06-18 15 views
10

Come posso controllare/rilevare quale versione di Visual Studio è in esecuzione con il mio VSPackage?Rileva la versione di Visual Studio all'interno di un VSPackage

Non riesco ad ottenere dal registro perché il computer potrebbe avere diverse versioni installate, quindi suppongo che ci sia un'API in grado di ottenerlo.

Qualcuno sa come ottenerlo da un pacchetto di Visual Studio gestito utilizzando C#?

risposta

8

Infine ho scritto una classe per rilevare la versione di Visual Studio. Testato e funzionante:

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

Questa soluzione ha senso rispetto a DTE.Version, poiché prima o poi DTE sarà deprecato da VS API (nello stesso modo in cui la tecnologia addin VS è stata deprecata). Il codice proposto può essere migliorato usando fvi.FileMajorPart e fvi.FileMinorPart che restituisce due interi, evitando così la parte di parsing delle stringhe nel codice proposto. –

+0

+1 perché questo codice recupera la versione completa (ad esempio 11.0.61030.00) che può essere utilizzata per dedurre il livello di aggiornamento di VS. DTE.Version restituisce solo ad es. "11.0" –

+0

Qualsiasi motivo per preferire msenv.dll su devenv.exe? Solo curioso. Inoltre: mi chiedo se c'è davvero bisogno di un blocco? –

14

Si potrebbe provare a ottenere la versione tramite l'oggetto DTE automazione. In MPF ​​si potrebbe ottenere in questo modo:

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

Ci sono alcune altre cose relative alla recuperare oggetto DTE - via Project.DTE, anche leggere this thread se stai ricevendo null per DTE.

Quindi è possibile ottenere la versione utilizzando DTE.Version property.

anche utili informazioni potrebbe essere trovato su Carlos Quintero (VS Addin ninja) sito HOWTO: Detect installed Visual Studio editions, packages or service packs

+0

per Visual Studio 2010 questa proprietà restituisce "10.0" e "12,0" per Visual Studio 2013. – Wolf5

+0

è possibile ottenere Numero di aggiornamento VS (ad esempio aggiornamento 3) utilizzando DTE? – Bandara

2

Credo che il seguente codice è migliore:

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