2012-06-18 38 views
10

Làm cách nào để kiểm tra/phát hiện phiên bản Visual Studio nào đang chạy trong VSPackage của tôi?Phát hiện phiên bản Visual Studio bên trong VSPackage

Tôi không thể nhận được từ sổ đăng ký vì máy tính có thể có nhiều phiên bản được cài đặt, vì vậy tôi đoán có một API có khả năng nhận được nó.

Bất kỳ ai biết cách lấy nó từ gói Visual Studio được quản lý bằng C#?

Trả lời

8

Cuối cùng tôi đã viết một lớp học để phát hiện các phiên bản Visual Studio. Kiểm tra và làm việc:

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

Giải pháp này có ý nghĩa so với DTE.Version, vì sớm hay muộn DTE sẽ không được chấp nhận từ VS API (cùng một cách công nghệ VS addin đã không được chấp nhận). Mã đề xuất có thể được tăng cường bằng cách sử dụng fvi.FileMajorPart và fvi.FileMinorPart trả về hai số nguyên, điều này tránh phần phân tích cú pháp chuỗi trong mã được đề xuất. –

+0

+1 vì mã này truy lục phiên bản đầy đủ (ví dụ: 11.0.61030.00) có thể được sử dụng để suy ra mức cập nhật của VS. DTE.Version chỉ trả về ví dụ: "11.0" –

+0

Bất kỳ lý do nào để thích msenv.dll hơn devenv.exe? Chỉ tò mò thôi. Ngoài ra: tự hỏi nếu có thực sự khóa cần thiết? –

14

Bạn có thể thử tải phiên bản qua đối tượng DTE tự động. Trong MPF bạn có thể nhận được nó theo cách này:

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

Có một số điều khác có liên quan để lấy đối tượng DTE - qua Project.DTE, cũng đọc this thread nếu bạn đang nhận được null cho DTE.

Sau đó, bạn có thể nhận phiên bản bằng cách sử dụng DTE.Version property.

Ngoài ra thông tin hữu ích có thể được tìm thấy trên Carlos Quintero (VS addin ninja) website HOWTO: Detect installed Visual Studio editions, packages or service packs

+0

Đối với Visual Studio 2010 khách sạn này trở lại "10,0" và "12.0" cho Visual Studio 2013. – Wolf5

+0

Có thể để có được VS Số cập nhật (ví dụ: Cập nhật 3) sử dụng DTE? – Bandara

2

Tôi nghĩ rằng đoạn mã sau là tốt hơn:

string version = ((EnvDTE.DTE) ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE.DTE).GUID)).Version; 
Các vấn đề liên quan