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
实例具有一个名为 Writer
的 System.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());
}
后续步骤
了解更多信息:
- 详细了解命令
- 详细了解如何在 工具窗口中公开 IDE 中的功能
- 了解如何通过用户提示与用户交互
查看示例代码:
- 有关创建使用输出窗口的扩展的完整示例,请参阅 OutputWindowSample 示例。