2011-10-14 38 views
11

Tôi đang viết một Visual Studio 2010 Add-In đơn giản để làm một công việc sao chép phổ biến ở đây tại nơi làm việc (nhận dll từ libs sln).Làm cách nào để ghi vào cửa sổ đầu ra trong Visual Studio 2010 AddIn?

Tôi muốn tiến trình sao chép được ghi vào cửa sổ đầu ra.

Tôi đã thử Trace.WriteLine(...) mong rằng để thực hiện, nhưng không phải khi tôi chạy bổ trợ trong trình gỡ rối. Tôi chưa thử cách nào khác.

Tôi đã tìm thấy một số ví dụ về thực hiện điều đó trong Visual Studio 2008, nhưng các thư viện yêu cầu không có sẵn để tham khảo.

Có ai có thể chỉ cho tôi cách viết thư cho cửa sổ đầu ra không? Kỹ năng googling của tôi đã thất bại tôi.

Trả lời

16

Tôi đã làm điều này cho một macro tôi đã viết:

Window window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput); 
OutputWindow outputWindow = (OutputWindow) window.Object; 
outputWindow.ActivePane.Activate(); 
outputWindow.ActivePane.OutputString(message); 

Dưới đây là một liên kết cho các giao diện DTE: http://msdn.microsoft.com/en-us/library/envdte.dte(v=VS.100).aspx

+0

Dte đối tượng là gì? (đọc tài liệu ngay bây giờ, nhưng nó sẽ được tốt đẹp trong câu trả lời cho tài liệu tham khảo trong tương lai) –

+1

Đối với những người theo, dte, được định nghĩa trong connect.cs, trên phương pháp kết nối. Hãy tìm điều này về phía dưới cùng của tập tin: riêng DTE2 _applicationObject; Sử dụng nó như dte –

+0

Điều này làm việc cho tôi :) – Achilles

1

Tôi viết một Visual Studio add-in và có cùng vấn đề, tuy nhiên khi thử câu trả lời ở trên, tôi thấy rằng dòng:

outputWindow.ActivePane.Activate(); 

đã xảy ra lỗi.

NullReferenceException - Tham chiếu đối tượng không được đặt thành thể hiện của đối tượng.

Tuy nhiên bây giờ tôi đã tìm ra một cách hơi khác nhau để giải quyết vấn đề:

Window window = applicationObject.Windows.Item(Constants.vsWindowKindOutput); 
OutputWindow outputWindow = (OutputWindow)window.Object; 
OutputWindowPane owp; 
owp = outputWindow.OutputWindowPanes.Add("new pane"); 
owp.OutputString("hello"); 
8

Như Robert chỉ ra, mã của John sẽ ném một ngoại lệ khi không có ActivePane. Nếu có một cửa sổ hoạt động, nó sẽ sử dụng ô nào đang hoạt động.

Một vấn đề tôi có với ví dụ của Robert là tùy thuộc vào nơi bạn tạo ngăn, trong trường hợp của tôi là phương thức Exec, nó sẽ tạo nhiều ô có cùng tên mỗi khi nó được chạy.

Bao gồm ví dụ của tôi về cách tôi gặp vấn đề đó. Khá đơn giản, chỉ cần kiểm tra sự tồn tại của cửa sổ trước tiên ...

 Window   window   = _applicationObject.Windows.Item(EnvDTE.Constants.vsWindowKindOutput); 
     OutputWindow  outputWindow  = (OutputWindow)window.Object; 
     OutputWindowPane outputWindowPane = null; 

     for (uint i = 1; i <= outputWindow.OutputWindowPanes.Count; i++) 
     { 
     if (outputWindow.OutputWindowPanes.Item(i).Name.Equals(OUTPUT_WINDOW_NAME , StringComparison.CurrentCultureIgnoreCase)) 
     { 
      outputWindowPane = outputWindow.OutputWindowPanes.Item(i); 
      break; 
     } 
     } 

     if (outputWindowPane == null) 
     outputWindowPane = outputWindow.OutputWindowPanes.Add(OUTPUT_WINDOW_NAME); 

     outputWindowPane.OutputString("Message"); 
Các vấn đề liên quan