2012-06-18 45 views
10

如何檢查/檢測在我的VSPackage下運行的Visual Studio版本?檢測VSPackage內部的Visual Studio版本

我無法從註冊表中獲取,因爲計算機可能安裝了多個版本,所以我猜想有一個API能夠獲取它。

任何人都知道如何使用C#從託管的Visual Studio包中獲取它?

回答

8

最後,我寫了一個類檢測的Visual Studio版本。測試和工作:

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

與DTE.Version相比,此解決方案有意義,因爲遲早DTE將從VS API棄用(與VS插件技術相同的方式已被棄用)。建議的代碼可以通過使用返回兩個整數的fvi.FileMajorPart和fvi.FileMinorPart來增強,這樣可以避免提出的代碼中的字符串解析部分。 –

+0

+1,因爲此代碼檢索可用於推斷VS的更新級別的完整版本(例如11.0.61030.00)。 DTE.Version只返回例如「11.0」 –

+0

任何理由更喜歡msenv.dll而不是devenv.exe?只是好奇。另外:想知道是否真的需要鎖定? –

14

您可以嘗試通過自動化DTE對象獲取版本。在強積金你能得到它以這種方式:

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

還有其他的一些相關的東西來獲取DTE對象 - 通過Project.DTE,也看過this thread如果你對DTE越來越空。

然後,您可以使用DTE.Version property獲取版本。

而且有用的信息,可以在卡洛斯·金特羅找到(VS插件忍者)網站HOWTO: Detect installed Visual Studio editions, packages or service packs

+0

對於Visual Studio 2010年,這個屬性返回 「10.0」 和 「12.0」 爲Visual Studio 2013年 – Wolf5

+0

是否有可能得到VS更新號碼(例如更新3)使用DTE? – Bandara

2

我認爲下面的代碼是更好:

string version = ((EnvDTE.DTE) ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE.DTE).GUID)).Version; 
相關問題