2009-07-07 4 views
27

사용자 지정 도구를 쓰고 있는데 현재 기능과 관련하여 원하는대로하고 있습니다. 뭔가 잘못되면 Visual Studio에 쓸 수 있기를 바랍니다. (형식이 잘못된 코드 또는 기타).내 사용자 지정 도구의 Visual Studio 출력 창에 어떻게 쓰나요?

이에 대한 표준이 있습니까? 지금은 기본적으로 도구가 강제로 실패 할 수 있으며 Visual Studio에서는 경고를 표시합니다. 출력 창에 보내려는 결과 메시지가있는 범주가 필요합니다. 또한 오류 목록 창에 더 자세한 설명이 포함 된 작업/경고로 살 수 있습니다.

+0

표준 출력으로 쓰는 것이 왜 효과가 없습니까? – avakar

+0

Console.Write에 메시지를 쓰지 않아도 출력 창에 아무것도 표시되지 않습니다. –

답변

44

Visual Studio에서 "일반"출력 창에 쓸 수있는 출력 창, 다음을 수행해야 IVsOutputWindowIVsOutputWindowPane

IVsOutputWindow outWindow = Package.GetGlobalService(typeof(SVsOutputWindow)) as IVsOutputWindow; 

// Use e.g. Tools -> Create GUID to make a stable, but unique GUID for your pane. 
// Also, in a real project, this should probably be a static constant, and not a local variable 
Guid customGuid = new Guid("0F44E2D1-F5FA-4d2d-AB30-22BE8ECD9789"); 
string customTitle = "Custom Window Title"; 
outWindow.CreatePane(ref customGuid, customTitle, 1, 1); 

IVsOutputWindowPane customPane; 
outWindow.GetPane(ref customGuid, out customPane); 

customPane.OutputString("Hello, Custom World!"); 
customPane.Activate(); // Brings this pane into view 

자세한 사항은 MSDN에서 찾을 수 있습니다 : 이것은 당신이해야 할 일이다.

오류 목록에 항목을 추가

오류 목록은 IVsSingleFileGenerator는 유형 IVsGeneratorProgress의 매개 변수가있는 메서드 호출 void Generate(...) 있습니다. 이 인터페이스에는 오류 및 경고를 Visual Studio 오류 목록에보고 할 수있는 void GeneratorError() 메서드가 있습니다.

public class MyCodeGenerator : IVsSingleFileGenerator 
{ 
    ... 
    public void Generate(string inputFilePath, string inputFileContents, string defaultNamespace, out IntPtr outputFileContents, out int output, IVsGeneratorProgress generateProgress) 
    { 
     ... 
     generateProgress.GeneratorError(false, 0, "An error occured", 2, 4); 
     ... 
    } 
    ... 
} 

자세한 내용은 GeneratorError()은 MSDN에서 찾을 수 있습니다.

+0

사용자 지정 창 : I (VS2010)이 솔루션을 사용하는 경우 아무 것도 표시하지 않는 멋진 창 구가 나타납니다. 내가 변경하면 outWindow.CreatePane (ref customGuid, customTitle, 1, 0); all is well ...이 변경은 솔루션이 닫힌 후에 창을 지우지 못했음을 의미하며 창에 아무 것도 표시하지 않는 이유는 알 수 없습니다. 너는 할수 있니? – BennyBarns

+0

죄송합니다, 저는 잘 모릅니다. 나는 VS2008을 위해이 것을 썼다. 그리고 그때 이후로 VS 플러그인 개발을 다루지 않았다 ... – Alex

+0

내 경우, 패널이 활성화되지 않는다. 'customPane.Activate();'가 작동하지 않습니다. 어떤 생각? –

0

디버그 및/또는 추적 클래스를 사용할 수 있습니다. 여기에 몇 가지 정보가 있습니다. http://msdn.microsoft.com/en-us/library/bs4c1wda(VS.71).aspx

행운을 빈다.

+1

이 질문을하기 전에 trace.write (message, category)를 시도했으나 출력되지 않았습니다. –

4

출력 창에 표시 할 내용이 있으면 표준 출력을 사용해야합니다. 이렇게하려면 앱을 '콘솔'앱으로 연결해야합니다. 프로젝트 등록 정보 페이지의 링커/시스템에서/SUBSYSTEM : CONSOLE 플래그를 설정하여 SubSystem 속성을 CONSOLE로 설정합니다.

출력 내용이 창에 표시되면 "오류 :"텍스트를 포함하면 오류로 표시되거나 "경고 :"로 설정하면 경고로 표시됩니다. 오류 텍스트가 괄호 안의 경로/파일 이름으로 시작되면 IDE는이를 "클릭 가능한"오류로 인식하고 자동으로 오류가있는 행으로 이동합니다. ,

IVsOutputWindow outWindow = Package.GetGlobalService(typeof(SVsOutputWindow)) as IVsOutputWindow; 

Guid generalPaneGuid = VSConstants.GUID_OutWindowGeneralPane; // P.S. There's also the GUID_OutWindowDebugPane available. 
IVsOutputWindowPane generalPane; 
outWindow.GetPane(ref generalPaneGuid , out generalPane); 

generalPane.OutputString("Hello World!"); 
generalPane.Activate(); // Brings this pane into view 

그러나, 사용자 정의 창에 기록하려면 다음

+0

C#에서이 작업을 수행하고 있으며 프로젝트 속성에/subsystem 항목이 없습니다.이 작업을 수행하려면 콘솔 응용 프로그램을 만들어야합니까? 현재는 DLL로 작동하지만 분명히 출력이 나오지 않습니다. –

+0

DLL입니까? 어떻게 호출되고 있습니까? 일반적으로 출력 창은 MSBuild가 생성하는 도구 체인에서 실행되는 도구를 캡처하지만 모든 항목이 독립적 실행 파일임을 알고있는 한 MSBuild는 모든 stdout을 캡처하여 창에 표시합니다. 사용자 지정 도구가 건물과 관련이 없을 수도 있습니다. "출력"창은 빌드 프로세스를 위해 예약되어 있습니다. 런타임 정보를 출력하려면 디버그 창 (OutputDebugString() 또는 Debug.Print() 등)을 사용해야합니다. –

+2

감사합니다. 행운을 빌어 MSBuild에서 오류를 만드는 방법을 발견하고 웹에서 경고를 만드는 방법을 검색했습니다. 흥미롭게도, 귀하의 설명이 나를 위해 직접 작동하지 않았다. ": warning : "(따옴표 제외)을 출력하여 작동하도록했습니다. Visual Studio는 경고가 특정 파일/행 #과 관련되어 있으면 경고 텍스트에서 파일/행 # 정보를 구분하는 데 사용되는 콜론을 원했습니다. 어떤 이유로 든 VS 2008은 "경고 : 텍스트"만 허용하지 않습니다. 또한 출력 스트림이 stdout, stderr인지 여부는 중요하지 않습니다. 그리고 대소 문자를 구분합니다. 게 쉬. –

-2

사용 System.Diagnostics.Debugger.Message

7

현재 DTE2 인스턴스를 잡아 Marshal.GetActiveObject를 사용하는 또 다른 방법이있다.

첫 번째 참조 EnvDTE 및 envdte80. 이것은 현재 VisualStudio 2012에서 작동하지만 다른 것들은 아직 시도하지 않았습니다.

using System; 
using System.Runtime.InteropServices; 
using EnvDTE; 
using EnvDTE80; 

internal class VsOutputLogger 
{ 
    private static Lazy<Action<string>> _Logger = new Lazy<Action<string>>(() => GetWindow().OutputString); 

    private static Action<string> Logger 
    { 
     get { return _Logger.Value; } 
    } 

    public static void SetLogger(Action<string> logger) 
    { 
     _Logger = new Lazy<Action<string>>(() => logger); 
    } 

    public static void Write(string format, params object[] args) 
    { 
     var message = string.Format(format, args); 
     Write(message); 
    } 

    public static void Write(string message) 
    { 
     Logger(message + Environment.NewLine); 
    } 

    private static OutputWindowPane GetWindow() 
    { 
     var dte = (DTE2) Marshal.GetActiveObject("VisualStudio.DTE"); 
     return dte.ToolWindows.OutputWindow.ActivePane; 
    } 
} 
+0

대답은 VS2010에서는 작동하지 않지만 – smirkingman

+2

이 방법이 효과적 일지 모르지만 여러 Visual Studio 인스턴스가 열려 있으면 처음 열면 메시지가 표시 될 수 있습니다. –

관련 문제