写入 Visual Studio 输出窗口

Visual Studio IDE 中的“输出”窗口是一个 工具窗口,可用于向用户传递状态、诊断/日志记录或任何其他信息性文本。 与用户提示(可能会显示消息框)不同,仅当用户在 IDE 中将“输出”窗口设置为可见并且在“显示以下来源的输出”下拉列表中选择了自己的通道时,才会显示写入“输出”窗口的消息。 当用户从主菜单中选择“视图”>“输出”菜单时,“输出”窗口将变为可见。

入门

重要

VisualStudio.Extensibility 输出窗口 API 目前处于预览状态,可能会更改。 利用这些 API 的任何扩展可能无法在 Visual Studio 的未来版本中工作,并且需要在发布较新版本的 API 时更新。

若要开始,请参阅“入门”部分中的 创建项目 部分。

使用“输出”窗口

本指南旨在介绍可以使用“输出”窗口执行的最常见操作:

获取“输出”窗口通道

若要写入“输出”窗口,需要一个输出窗口通道,可以通过调用 VisualStudioExtensibility.Views().Output.CreateOutputChannelAsync()来创建该通道。

OutputWindowExtensibility.CreateOutputChannelAsync()

CreateOutputChannelAsync() 方法有两个参数:

参数 类型 必需 描述
displayName string 是的 输出窗口的显示名称。 这是“输出”窗格中的“显示输出来源:”下拉菜单中显示的内容。 此值被标记为 “可本地化” 以便于本地化显示名称。
cancellationToken CancellationToken 是的 异步操作的 CancellationToken

编辑或添加扩展类

如果项目尚未包含派生自 Extension的类,则需要添加一个类,如下所示(在本例中称为 MyExtension.cs):

using System.Resources;
using Microsoft.VisualStudio.Extensibility;

namespace MyProject
{
    public class MyExtension : Extension
    {
        // Initiailzation code here
    }
}

添加初始化代码

此代码可以用于显示输出消息(如 命令),但重要的是,对于给定的输出窗口通道显示名称,只能调用 CreateOutputChannelAsync() 一次。如果有冲突,则会引发异常,因此请考虑在一次性初始化方法(如 InitializeAsync())中调用它。

public override async Task InitializeAsync(CancellationToken cancellationToken)
{
    string displayName = "My Output Window";

     // To use this Output window Channel elsewhere in the class, such as the ExecuteCommandAsync() method in a Command, save this result to a field in the class.
    OutputChannel? outputChannel = await this.Extensibility.Views().Output.CreateOutputChannelAsync(displayName, cancellationToken);
}

写入“输出”通道

获取输出窗口通道 中获取的 OutputChannel 实例具有一个名为 WriterSystem.IO.TextWriter 属性,该属性支持熟悉的文本写入操作,例如:

此外,还可以直接在 OutputChannel上调用 WriteAsync()WriteLineAsync(),或者通过 PipeWriter 属性访问 System.IO.Pipelines.PipeWriter

此代码片段可用于在输出窗口中显示消息,例如在 命令ExecuteCommandAsync() 方法中。

if (this.outputChannel != null)
{
    await this.outputChannel.Writer.WriteLineAsync("This is a test of the output channel TextWriter.");
    
    await this.outputChannel.WriteLineAsync("This is a test of the output channel.");

    var rom = new ReadOnlyMemory<byte>(Encoding.UTF8.GetBytes("This is a test of the output channel PipeWriter."));
    await this.outputChannel.PipeWriter.WriteLineAsync(rom, new());
}

后续步骤

了解更多信息:

查看示例代码:

  • 有关创建使用输出窗口的扩展的完整示例,请参阅 OutputWindowSample 示例。