【问题标题】:Visual Studio Language Service - Add Additional File Extension at RuntimeVisual Studio 语言服务 - 在运行时添加附加文件扩展名
【发布时间】:2015-03-16 12:19:24
【问题描述】:

我正在为 Visual Studio 2013 开发一个自定义 LanguageService 扩展包。我已经使用 ProvideLanguageExtensionAttribute 成功注册了一个文件扩展名。

[ProvideLanguageExtension(typeof(MyLanguageService), ".myext")]

我想允许用户配置哪些文件扩展名可以使用我的语言服务。是否可以在运行时向我的 LanguageService 注册其他文件扩展名?

注意:我最感兴趣的是是否有任何机制可以在运行时通过代码注册文件扩展名(例如服务)。关于如何通过 UI 向用户展示这一点的细节是一个单独的问题,而不是我现在真正要问的问题。

【问题讨论】:

  • 你在这方面有什么收获吗?我正在尝试做同样的事情,但无法找到任何有关为语言服务动态分配文件扩展名的信息。

标签: visual-studio visual-studio-2013 visual-studio-extensions


【解决方案1】:

在您的示例代码中,您使用ProvideLanguageExtensionAttribute 将某个文件扩展名链接到您的语言服务。 ProvideLanguageExtensionAttribute 类继承 RegistrationAttribute 类,可用于在安装过程中注册包信息(适用于 Visual Studio 2010 及任何更新版本)。我想,Visual Studio 不会在任何时候加载语言服务扩展时反映该属性,而是从注册表中读取信息......

另一个使用RegistrationAttribute 的好例子是ProvideFileFilterAttribute,它可以在codeplex 上发布的Visual Studio 的Python 工具 项目中找到。它用于扩展 Visual Studio 的打开文件对话框的文件过滤器列表,它可以让您了解注册属性的实现如何......我想说您可以轻松地想出一个可以添加或删除 IDE 在下次启动时获取的文件扩展名的服务...

我还在开发一个自定义语言服务扩展,它同时注册文件扩展名和 -filters;所以我只是检查了注册表以找到我通过属性提供的信息;这些是我的发现...

出现在打开文件对话框的过滤器列表中的文件扩展名存储在以下键...

HKCU\Software\Microsoft\VisualStudio\
    {version}_Config\Languages\File Extensions\{extension}

其中键的默认值包含语言服务的GUID...

Default => {xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx}

另外,还有一个键,但我不确定值是否是从属性中获取的……

HKCU\Software\Microsoft\VisualStudio\
    {version}_Config\Diff\SupportedContentTypes

与项目工厂和编辑器扩展关联的文件扩展名存储在以下键下...

HKCU\Software\Microsoft\VisualStudio\
    {version}_Config\Projects\{project-factory}\FileExtensions\{extension}

其中key包含项目工厂的GUID。键包含指向编辑器工厂的单个值...

EditorFactoryNotify => {xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx}

在我的语言服务中,我还覆盖了 LanguageService 实现的 GetFileExtensions- 和 GetFormatFilterList 方法...

【讨论】:

  • 我还没有看到GetFileExtensions 被调用。你知道它什么时候被调用吗?我正在尝试允许用户动态地将文件扩展名分配给我自己的语言服务,例如 OP,但事实证明这非常困难!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多