【译】VisualStudio.Extensibility 17.10:用 Diagnostics Explorer 调试您的扩展

想象一下,创建的扩展比以往任何时候都运行得更快、更流畅!如果您最近还没有跟上,我们一直在努力改进 VisualStudio. Extensibility SDK。VisualStudio. Extensibility 帮助您构建在主 IDE 进程之外运行的扩展,以提高性能和可靠性。它还提供了一个时尚而直观的基于 .NET 8 的 API 和全面且维护良好的文档,可以帮助您开发出色的扩展。

这个17.10版本建立在我们以前的版本之上,它带来了全新的调试体验,使您更容易让您的扩展以您期望的方式运行。我们还增强了远程UI特性,添加了提示用户的新方法,并继续向项目查询 API 添加功能。

请访问 https://aka.ms/VisualStudio.Extensibility 获取最新的文档和安装说明。我们鼓励您通过 GitHub 仓库的问题跟踪报告错误并建议功能,在那里您还可以找到扩展示例来帮助您开始。

VisualStudio.Extensibility 有什么新功能?

您想要比以前更快速、更容易地开发和调试扩展吗?我们的17.10版本增加了以下功能来帮助您做到这一点:

- 调试您的扩展使用我们新的 Diagnostics Explorer

- 在 UI 中利用 XAML 资源

- 让您的扩展用户选择文件或目录

- 使用改进的查询 API 跟踪项目更改

调试您的扩展使用我们新的 Diagnostics Explorer

我们已经创建了一个强大的新工具来调试您的扩展,叫做 VisualStudio.Extensibility Diagnostics Explorer,可以在 Visual Studio Marketplace 中找到它。有了它,您就能像 Visual Studio 那样看到扩展,从而确保您正确地配置了您的扩展。

这个工具本身是作为进程内的 VisualStudio. Extensibility 扩展编写的。可以帮助您回答诸如"为什么我的命令没有显示在我期望它在 IDE 中的位置?"或"为什么我的扩展没有在我期望的时候被激活?"

检查配置

VisualStudio.Extensibility 通过消除手动维护单独的元数据文件的需要,已经使您更容易配置扩展。现在,我们在此基础上构建了 Diagnostics Explorer,它可以让您准确地看到 Visual Studio 发现了哪些扩展和组件,以及每个发现项的配置。

例如,如果您没有在 IDE 中看到命令,您可以使用命令选项卡 Diagnostics Explorer 查看已贡献给 Visual Studio 的任何命令。如果它没有出现在列表中,这是一个提示,需要再次检查您的配置以确保它被发现。如果它存在,但未启用或不可见,则可能需要检查激活约束。如果它被标记为启用和可见,您可以使用下拉菜单来查看命令放置,以确保您已经正确地放置了它。

使用 Commands 选项卡,您可以检查命令、命令集、组、菜单和工具栏、命令位置和动态命令锚点。其他选项卡允许您检查组件的其他功能区域,包括工具窗口、文档类型、文本视图等。当我们在未来的版本中添加功能时,您将能够在 Diagnostics Explorer 中检查任何新组件。

查看实时事件日志

我们知道,像您这样的扩展开发人员有时开发的扩展可能需要处理整个 IDE 中的事件,例如正在执行的命令,正在打开的工具窗口或正在创建的 TextView,所以我们添加了一个实时事件查看器,使您能够实时观察这些事件及其属性:

创建更好的激活约束

Diagnostics Explorer 中的 Activation Constraints 选项卡为您提供了创建激活约束时每个可用值的当前状态。使用此选项卡,您可以使 IDE 进入您想要用于激活的状态(例如构建项目或打开 markdown 文件),然后您可以检查每个可用表达式的值,以帮助您创建约束。

例如,假设您希望一个命令仅在编辑器中打开 C# 文件时才可见。使用 Diagnostics Explorer,您可以打开一个 C# 文件,使用 Activation Constraints 选项卡来帮助您确定需要哪些表达式来创建约束:

复制代码
EnabledWhen = ActivationConstraint.ClientContext(ClientContextKey.Shell.ActiveEditorContentType, "CSharp").

在 UI 中利用 XAML 资源

XAML 资源允许您定义可以在整个项目中使用的对象,如颜色、笔刷或样式,从而加速UI开发。通过这个版本的 VisualStudio. Extensibility:我们正在添加对 XAML 资源的支持,以帮助您为扩展开发出色的UI!

与我们的其他远程UI功能(如UI控件)一致,您可以将任何带有 ResourceDictionaries 的XAML文件定义为嵌入在 .csproj 文件中的资源:

复制代码
<ItemGroup>
    <EmbeddedResource Include="\XamlResources.*xaml" />
    <Page Remove="XamlResources.*xaml" />
</ItemGroup>

一旦定义,很容易将您的资源包含在其他组件中,以便它们可以在整个项目的 XAML 中被引用:

复制代码
ResourceDictionaries.AddEmbeddedResource("XamlResources.xaml")

您甚至可以本地化您的资源:查看 Modal Dialog 示例获取更多信息,并让我们知道您的想法!

让您的扩展用户选择文件或目录

在我们之前对用户提示和自定义对话框的支持的基础上,我们增加了从扩展中显示文件和目录选择器提示的能力。例如,您可以使用 ShowOpenFileDialogAsync() 方法来提示用户选择一个文件来打开:

复制代码
VisualStudioExtensibility.Shell().ShowOpenFileDialogAsync(options, cancellationToken);

使用新的 API,您可以提示用户:

- 选择一个文件打开

- 选择要打开一个或多个文件

- 选择单个文件来另存为

- 选择要打开的目录

与往常一样,如果有其他类型的用户提示对您的扩展很重要,请通过我们的问题跟踪告诉我们。

使用改进的查询 API 跟踪项目更改

我们的 17.10 版本为项目查询 API 添加了三个新特性。

跟踪查询结果的更改

TrackUpdatesAsync() 方法可以在项目系统查询中使用,以创建一个 IObserver 对象来跟踪您的查询中项目或解决方案状态的变化。例如,如果您想跟踪项目中文件的更新时间,您可以使用:

复制代码
var query = await myProject
    .Files
    .With(f => f.FileName)
    .TrackUpdatesAsync(new TrackerObserver(), CancellationToken.None);

在这个例子中,TrackerObserver 实现了 IObserver<IQueryTrackUpdates<IFileSnapshot>>,所以您可以使用您自己的自定义逻辑来处理更新事件。

查询项目规则

项目查询 API 中的每个项目现在都包含一个 RulesResults 特性,其中包括规则名称和一个项列表。您可以通过调用指定配置的 RuleResultsByName() 来访问这些规则。

复制代码
var results = await querySpace
    .Projects
    .With(p => p.Path)
    .With(p => p.ActiveConfigurations
        .With(c => c.RuleResultsByRuleName("CompilerCommandLineArgs")
            .With(r => r.RuleName)
            .With(r => r.Items
                .With(i => i.Name))))
        .ExecuteQueryAsync();

跳过查询结果

我们添加了 Skip() 方法,使您能够跳过查询中的结果。

复制代码
var projects = await queryableSpace.Projects
    .With(proj => proj.Name)
    .Skip(1)
    .ExecuteQueryAsync();

这里,跳过第一个项目,返回其余的项目。

如果没有您的参与我们做不到这些!

我们需要您的帮助,因为我们将继续开发 VisualStudio.Extensibility!请尝试这个预览版,让我们知道您的想法。查看文档,浏览代码示例,并构建您的第一个扩展。您可以通过我们的问题跟踪发送反馈、报告问题或功能需求。

您还可以在我们的 VisualStudio. Extensibility GitHub repo 中找到有关突破性更改和已知问题的信息。

我们正在优先考虑扩展程序要求的功能,所以请尝试一下 VisualStudio. Extensibility,并与我们分享您的想法!

原文链接:https://devblogs.microsoft.com/visualstudio/visualstudio-extensibility-17-10/