我怎样写在我的自定义工具Visual Studio的输出窗口?(How do I write to

2019-06-25 07:52发布

我正在写一个自定义的工具,我现在有它做什么,我想尽可能的功能。 我想可以,如果出现错误编写到Visual Studio。 (格式不正确的代码或其他)。

有没有这方面的任何标准? 现在我基本上可以强制工具失败和Visual Studio放在一个警告,它已经这样做了。 我想在输出窗口的类别与我想给任何产生的消息。 我也可以生活在一个更具描述性的任务/在错误列表窗口警告。

Answer 1:

输出窗口

要写入在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上找到。



Answer 2:

还有用另一种方式Marshal.GetActiveObject抢跑DTE2实例。

第一参考EnvDTE和envdte80。 这目前是在2012年的VisualStudio,我没有尝试过其他人呢。

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;
    }
}


Answer 3:

如果你想要的任何东西出现在输出窗口,它必须来自标准输出。 要做到这一点,您的应用程序需要链接为“控制台”的应用程序。 设置/子系统:CONSOLE标志项目的属性页面,链接下/系统设置子系统属性控制台。

一旦你有你的输出窗口,如果包含文本“错误:”它会出现一个错误,或者如果你设置“警告:”这将显示为警告。 如果你的错误的文字与路径/文件名,然后在括号行号开始,IDE将其识别为“点击”的错误,并自动导航您的断层线。



Answer 4:

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

祝您好运。



Answer 5:

使用System.Diagnostics.Debugger.Message



文章来源: How do I write to the Visual Studio Output Window in My Custom Tool?