2012-06-18 19 views
10

Jak mogę sprawdzić/wykryć, które Visual Studio wersja działa pod moim VSPackage w VSPackage?Wykrywanie wersji Visual Studio wewnątrz

nie mogę się z rejestru, ponieważ komputer może mieć zainstalowanych kilka wersji, więc myślę, że istnieje API, które jest w stanie je zdobyć.

ktoś wie jak je zdobyć z zarządzanego pakietu Visual Studio przy użyciu C#?

Odpowiedz

8

Wreszcie napisałem klasę do wykrywania wersji programu Visual Studio. Przetestowane i pracy:

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

To rozwiązanie ma sens w porównaniu z wersją DTE.Version, ponieważ prędzej czy później DTE zostanie wycofane z interfejsu API VS (tak samo jak technologia dodawania VS została wycofana). Proponowany kod można ulepszyć za pomocą fvi.FileMajorPart i fvi.FileMinorPart, które zwracają dwie liczby całkowite, co pozwala uniknąć fragmentowania tekstu w proponowanym kodzie. –

+0

+1, ponieważ ten kod pobiera pełną wersję (np. 11.0.61030.00), której można użyć do określenia poziomu aktualizacji VS. DTE.Version zwraca tylko np. "11.0" –

+0

Jaki jest powód, aby preferować msenv.dll nad devenv.exe? Po prostu ciekawy. Ponadto: zastanawiam się, czy naprawdę potrzebne jest blokowanie? –

14

Możesz spróbować uzyskać wersję za pośrednictwem obiektu automatyzacji DTE. W MPF można dostać go w ten sposób:

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

Istnieje kilka innych rzeczy związanych umożliwiające odzyskanie obiektu DTE - poprzez Project.DTE również czytać this thread jeśli jesteś coraz null dla DTE.

Następnie można uzyskać wersję za pomocą DTE.Version property.

także użyteczne informacje można znaleźć na Carlos Quintero (VS dodatek ninja) Strona HOWTO: Detect installed Visual Studio editions, packages or service packs

+0

Visual Studio 2010 to właściwość zwraca "10.0" i "12,0" dla Visual Studio 2013. – Wolf5

+0

Czy to możliwe, aby uzyskać Numer aktualizacji VS (np. Aktualizacja 3) przy użyciu DTE? – Bandara

2

myślę, że lepiej jest następujący kod:

string version = ((EnvDTE.DTE) ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE.DTE).GUID)).Version; 
Powiązane problemy