2012-06-18 12 views
10

¿Cómo puedo verificar/verificar qué versión de Visual Studio se está ejecutando en mi VSPackage?Detectar la versión de Visual Studio dentro de un VSPackage

No puedo obtener del registro porque la computadora podría tener varias versiones instaladas, así que supongo que hay una API que puede obtenerla.

¿Alguien sabe cómo obtenerlo desde un paquete de Visual Studio administrado usando C#?

Respuesta

8

Por último, me escribió una clase para detectar la versión de Visual Studio. Probado y de trabajo:

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

Esta solución tiene sentido en comparación con DTE.Version, dado que tarde o temprano el DTE quedará obsoleto de VS API (de la misma manera que la tecnología VS addin quedó obsoleta). El código propuesto se puede mejorar utilizando fvi.FileMajorPart y fvi.FileMinorPart que devuelve dos enteros, esto evita la parte de análisis de cadenas en el código propuesto. –

+0

+1 porque este código recupera la versión completa (por ejemplo, 11.0.61030.00) que se puede usar para inferir el nivel de actualización de VS. DTE.Version only returns, p. "11.0" –

+0

¿Alguna razón para preferir msenv.dll a devenv.exe? Sólo curioso. Además: pregunto si realmente se requiere bloqueo. –

14

Puede intentar obtener la versión a través del objeto DTE de automatización. En MPF ​​se podía obtener de esta manera:

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

Hay algunas otras cosas relacionadas a recuperar el objeto DTE - a través de Project.DTE, también leyó this thread si usted está recibiendo nulo para DTE.

Luego puede obtener la versión usando DTE.Version property.

también información útil se puede conocer en Carlos Quintero (VS Ninja complemento) página web HOWTO: Detect installed Visual Studio editions, packages or service packs

+0

Para Visual Studio 2010 esta propiedad devuelve "10.0" y "12.0" para Visual Studio 2013. – Wolf5

+0

¿Es posible conseguir Número de actualización VS (por ejemplo, actualización 3) utilizando DTE? – Bandara

2

Creo que el siguiente código es mejor:

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