工作区和语言服务

语言服务可以为打开文件夹用户提供处理解决方案和项目时所用的相同丰富的语言功能。 语言服务可能会根据打开的文档的文件扩展名或内容自行激活,但此“松散文件”语言服务仅限于语法突出显示。 编辑/查看源代码时,需要提供更丰富的体验所需的其他信息。 每个语言服务都有自己的 API,用于初始化文档的此额外的上下文数据。 这通常由项目系统管理,它与语言服务和生成系统紧密耦合。

初始化

在工作区中,语言服务由一个ILanguageServiceProvider扩展点进行初始化,该扩展点仅专门使用该语言服务,并不知道生成创作。 这样,语言服务所有者就可以维护单个“打开文件夹”扩展,无论在生成期间运行编译器的文件夹和文件中存在多少模式(例如 MSBuild、生成文件等)。 在磁盘上更改文件上下文并刷新文件上下文时,语言服务提供程序将收到更新的文件上下文集的通知。 然后,语言服务提供商可以更新其模型。

在编辑器中打开文档时,Visual Studio 仅考虑需要找到匹配文件上下文提供程序的文件上下文类型的语言服务提供程序。 然后,它将文件上下文从匹配提供程序(s)传递到所选语言服务提供商。ILanguageServiceProvider.InitializeAsync 语言服务提供商对该文件上下文数据执行的操作是语言服务提供商的实现详细信息,但预期的用户体验是该打开的文档的更丰富的语言服务。

使用 ILanguageServiceProvider

创建与语言服务器导出属性之SupportedContextTypes一匹配的文件上下文ContextType时,将通知语言服务。

若要支持语言服务,扩展需要:

  • Guid一的。 这将用于 SupportedContextTypes 属性参数和对象中 FileContext
  • 语言文件上下文
    • 提供程序工厂
      • ExportFileContextProviderAttribute 具有上述唯一生成的 Guid 属性 SupportedContextTypes
      • 实现 IWorkspaceProviderFactory<IFileContextProvider>
    • 提供程序的实现 IFileContextProvider.GetContextsForFileAsync
      • 使用contextType构造函数参数作为唯一FileContext生成的新构造函数Guid
      • 使用属性ContextFileContextILanguageServiceProvider
  • 语言服务
    • 提供程序工厂
      • ExportLanguageServiceProvider 具有上述唯一生成的 Guid 属性 SupportedContextTypes
      • 实现 IWorkspaceProviderFactory<ILanguageServiceProvider>
    • 供应商
      • 实现 ILanguageServiceProvider
      • 用于 ILanguageServiceProvider.InitializeAsync 在打开文件时为提供的参数启用语言服务
      • 用于 ILanguageServiceProvider.UninitializeAsync 在关闭文件时禁用所提供的参数的语言服务

警告

ILanguageServiceProvider 线程上的工作区可能会调用这些方法。 请考虑在不同的线程上计划工作,以避免引入 UI 延迟。

语言服务器协议

Microsoft.VisualStudio.Workspace.* API 并不是在“打开文件夹”中启用语言服务的唯一方法。 另一个选项是使用语言服务器。 有关详细信息,请阅读 语言服务器协议

  • 工作区生成 -“打开文件夹”支持生成系统,如 MSBuild 和生成文件。