2010-02-25 33 views
23

Sau đây là cách bạn sẽ nhận được thư mục giải pháp hiện tại từ một add-in:Làm thế nào để bạn nhận được thư mục giải pháp hiện tại từ VSPackage?

_applicationObject = (DTE2)application; // retrieved from OnConnection method 
string solutionDir = System.IO.Path.GetDirectoryName(_applicationObject.Solution.FullName); 

Làm thế nào bạn sẽ làm điều này thông qua một VSPackage?

Tôi đang di chuyển một studio trực quan bổ trợ vào VSPackage vì tôi dự định thêm một số điều khiển người dùng yêu cầu tích hợp sâu hơn với IDE.

Tôi tìm thấy một số tài liệu tham khảo tốt về những giá trị tương đối của add-ins vs gói tích hợp như: http://nayyeri.net/visual-studio-addin-vs-integration-package-part-1

Và một số hướng dẫn tốt trên MSDN trên VSPackages như: http://msdn.microsoft.com/en-us/library/cc138589.aspx

Tôi có không tìm thấy một tài liệu tham khảo tốt (trên msdn hay cách khác) về cách giao diện cấp cao hơn trong bản đồ bổ trợ (như DTE) cho các giao diện cấp thấp hơn trong VSPackages.

Bất kỳ tham khảo nào tốt ngoài đó để giúp lập bản đồ chung từ giao diện bổ trợ cho giao diện VSPackage?

+0

2+ Câu hỏi và câu trả lời có liên quan đến sở thích của tôi. – Terrance

Trả lời

23

Tôi đã tìm thấy câu trả lời cho câu hỏi cụ thể. Các đối tượng VisualStudio.DTE thể được lấy ra bằng phương pháp GetService() như sau:

// Get an instance of the currently running Visual Studio IDE 
DTE dte = (DTE)GetService(typeof(DTE)); 
string solutionDir = System.IO.Path.GetDirectoryName(dte.Solution.FullName); 
+1

Mã này có bất kỳ vấn đề nào khi nhiều bản sao của studio trực quan đang chạy không? – Maslow

+0

Tôi đã sử dụng với nhiều phiên bản của VS ở chế độ chuẩn và ngủ đông và không gặp phải bất kỳ sự cố nào khi nhận được giải pháp hiện tại chính xác. Những cách tiếp cận trước đó, tôi đã thử DID gặp sự cố khi tải đúng trường hợp, chẳng hạn như: DTE dte = (DTE) System.Runtime.InteropServices.Marshal.GetActiveObject ("VisualStudio.DTE"); string solutionDir = System.IO.Path.GetDirectoryName (dte.Solution.FullName); –

7

Bạn có thể nhận được một đối tượng DTE từ một trong những chức năng:

public static DTE GetCurrentDTE(IServiceProvider provider) 
{ 
    /*ENVDTE. */DTE vs = (DTE)provider.GetService(typeof(DTE)); 
     if (vs == null) throw new InvalidOperationException("DTE not found."); 
    return vs; 
} 

public static DTE GetCurrentDTE() 
{ 
    return GetCurrentDTE(/* Microsoft.VisualStudio.Shell. */ServiceProvider.GlobalProvider); 
} 

Sau đó, bạn có thể nhận tích cực từ SolutionDTE.SolutionSolution đường dẫn từ DTE.Solution.Path thuộc tính.

+1

Mã đẹp. Bây giờ tôi biết làm thế nào để có được DTE Object. Nhưng làm thế nào để tôi có được một IServiceProvider (Khi không viết một phần mở rộng Visual Studio). – Vaccano

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