代码之家  ›  专栏  ›  技术社区  ›  Jeff Martin

如何在自定义工具中写入Visual Studio输出窗口?

  •  31
  • Jeff Martin  · 技术社区  · 15 年前

    我正在编写一个自定义工具,目前我已经让它做我想要的功能。如果出了问题,我想能够给Visual Studio写信。(格式不正确的代码或其他)。

    这有什么标准吗?现在,我基本上可以强制工具失败,Visual Studio会发出警告,警告它已经失败了。我希望在输出窗口中有一个包含我要发送的任何结果消息的类别。我还可以在错误列表窗口中使用更具描述性的任务/警告。

    5 回复  |  直到 15 年前
        1
  •  53
  •   Alex    15 年前

    输出窗口

    要在Visual Studio中写入“常规”输出窗口,需要执行以下操作:

    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
    

    但是,如果要写入自定义窗口,则需要执行以下操作:

    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
    

    细节 IVsOutputWindow IVsOutputWindowPane 可以在msdn上找到。

    错误列表

    如果要将项添加到错误列表,请 IVsSingleFileGenerator 具有方法调用 void Generate(...) 它有一个类型的参数 IVsGeneratorProgress . 此接口有一个方法 void GeneratorError() 它允许您向Visual Studio错误列表报告错误和警告。

    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上找到。

        2
  •  8
  •   Daniel Fisher lennybacon mythz    6 年前

    还有另一种方法 Marshal.GetActiveObject 去跑步 DTE2 实例。

    第一个参考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;
        }
    }
    
        3
  •  4
  •   John Deters    15 年前

    如果您想在输出窗口中显示任何内容,它必须来自stdout。为此,您的应用程序需要作为“控制台”应用程序链接。在项目的属性页中,在链接器/系统下设置/subsystem:console标志,将subsystem属性设置为console。

    一旦您在窗口中有了输出,如果您包含文本“错误:”,它将显示为一个错误,或者如果您设置“警告:”,它将显示为一个警告。如果错误文本以路径/文件名开头,后跟括号中的行号,则IDE会将其识别为“可单击”错误,并自动导航到错误行。

        4
  •  0
  •   Jon Onstott    15 年前

    您可以使用调试类和/或跟踪类。这里有一些信息: http://msdn.microsoft.com/en-us/library/bs4c1wda(VS.71).aspx

    祝你好运。

        5
  •  -2
  •   Juan Mellado user183856    12 年前

    使用 System.Diagnostics.Debugger.Message