Visual Studio语言服务 - 在运行时添加其他文件扩展名

时间:2015-03-16 12:19:24

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

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

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

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

注意:我最感兴趣的是在运行时是否存在通过代码注册文件扩展名的机制(例如服务)。有关如何通过用户界面向用户显示此信息的详细信息是一个单独的问题,而不是我此时正在询问的内容。

1 个答案:

答案 0 :(得分:1)

在示例代码中,您使用ProvideLanguageExtensionAttribute将特定文件扩展名与您的语言服务相关联。 ProvideLanguageExtensionAttribute类继承RegistrationAttribute类,可用于在安装期间注册包信息(适用于Visual Studio 2010和任何较新版本)。我想,Visual Studio不会在语言服务扩展加载时反映该属性,而是从注册表中读取信息......

使用RegistrationAttribute的另一个好例子是ProvideFileFilterAttribute,它可以在codeplex上发布的 Python Tools for Visual Studio 项目中找到。它用于扩展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}

因此密钥包含项目工厂的GUID。该键包含指向编辑器工厂的单个值...

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

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