6

Tôi có một phiên bản Project và tôi không hiểu cách tìm hiểu loại/ngôn ngữ dự án. Cụ thể, tôi cần kiểm tra dự án C/C++.Làm thế nào để xác định có hay không đối tượng EnvDTE.Project đại diện cho một dự án C/C++?

docs dường như thiếu.

Trước đó, một người khác thêm vào các bit sau của ma thuật để mở rộng VS mã nguồn mở của tôi, và nó hoạt động trong VS2013-2015:

private static bool isVisualCppProject(object project) 
{ 
    Type projectObjectType = project.GetType(); 
    var projectInterface = projectObjectType.GetInterface("Microsoft.VisualStudio.VCProjectEngine.VCProject"); 
    return projectInterface != null; 
} 

    ... 

isVisualCppProject(project.Object); 

Nhưng nó không còn hoạt động trong VS 2017 RC. Và tôi sẵn sàng loại bỏ ma thuật phản chiếu thời gian chạy này và không đánh số objectdynamic thay vì Project - mã đã không thể thực hiện được vì điều này.

+0

Có thuộc tính 'Kind' (https://msdn.microsoft.com/en-us/library/envdte.project.kind.aspx) cho' envdte.project'. Đó là GUID. Có các kiểu Project được định nghĩa trước trong 'PrjKind' (https://msdn.microsoft.com/en-us/library/vslangproj.prjkind.aspx) nhưng có vẻ như không có thuộc tính cho c/C++. Tôi đoán bạn có thể nhận được rằng GUID và nó sẽ giống nhau cho tất cả các dự án c/C++. –

+0

@AramKocharyan: Tôi đã thấy 'Loại', nhưng không có danh sách các loại" có thể ", cũng không bảo đảm rằng nó thực sự tĩnh trên các máy, cài đặt và phiên bản VS khác nhau ... –

+0

@ Violet-Hươu cao cổ: Bạn có giải quyết được không vấn đề? nếu vấn đề vẫn còn tồn tại, xin vui lòng cho tôi biết. –

Trả lời

1

bạn có thể xác định loại dự án thông qua tên tiện ích mở rộng dự án và bản trình diễn sau để bạn tham khảo.

DTE2 dte = (DTE2)this.ServiceProvider.GetService(typeof(DTE)); 
      Solution2 solution = (Solution2)dte.Solution; 

      foreach (Project p in solution.Projects) 
      { 

       string[] projectName = p.FullName.Split('.'); 

       if (projectName.Length > 1) 
       { 
        string fileExt = projectName[projectName.Length-1]; 

        if (fileExt == "vcxproj") 
        { 
         //is c/c++ porject 
        } 
       } 
} 
1

EnvDTE.Project.Kind là nơi đầu tiên để xem, như đã đề cập trong các nhận xét ở trên. Xem HOWTO: Guess the type of a Visual Studio project from an add-in or macro

Có danh sách một số GUID nổi tiếng, xem INFO: List of known project type Guids.

Có thể bạn quan tâm đến {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}. Nhưng một dự án có thể có nhiều loại phụ khác nhau, trong trường hợp này nhiều GUID được áp dụng cho nó. Ví dụ MVC + C#. Xem HOWTO: Get the project flavor (subtype) of a Visual Studio project from an add-in

EnvDTE.Project.Kind chứa loại dự án chính và không được đảm bảo, ví dụ: C++ GUID sẽ được lưu trữ trong thuộc tính này. Cách an toàn nhất là truy xuất tất cả GUID được áp dụng cho một dự án. Sử dụng phương thức GetProjectTypeGuids từ liên kết cuối cùng. Bạn sẽ nhận được danh sách tất cả GUID và sau đó bạn sẽ chỉ kiểm tra nếu nó chứa {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}.

Các vấn đề liên quan