1

在 Visual Studio 编辑器中打开文件时,通过EnvDTE.Document.Language属性返回字符串结果,例如“CSharp”、“C/C++”、“HTML”、“JScript”等,指定语言一份文件。我希望能够在文件未打开时(即从 ProjectItem 上下文)访问相同的语言信息。

EnvDTE.ProjectItem.FileCodeModel.Language似乎很有希望,但只给了我一个 CSharp 文件的结果。没有可用于 HTML、XAML 等的信息。

我可以根据文件扩展名做出假设,但是能够检索由 Visual Studio 解释的语言(可能是通过语言服务)会更加健壮。信息似乎是可用的,因为它存储在文档中,但我无法找到正确的 API 来访问它。

任何帮助或建议将不胜感激。:)

4

1 回答 1

3

对于任何可能偶然发现这一点的人,我找到了一种可行的方法。我仍然很想知道是否有人有更清洁的解决方案。

  • 导入 Microsoft.VisualStudio.Package.LanguageService.9.0(或等效)程序集。
  • 实例化一个 EditorFactory
  • 在 EditorFactory 实例上调用 GetLanguageService,传递项目项的扩展名(即 System.IO.Path.GetExtension(ProjectItem.Name))
  • 将返回的语言服务 GUID 与已知常量进行比较。您可以在 HKEY_USERS\.DEFAULT\Software\Microsoft\VisualStudio\10.0_Config\Languages\Language Services (或等效)下从注册表中挖掘这些

以下是我发现的语言服务指南,可以帮助其他人免去查找它们的麻烦:

CSharp:“{694DD9B6-B865-4C5B-AD85-86356E9C88DC}”
C/C++:“{B2F072B0-ABC1-11D0-9D62-00C04FD9DFD9}”
CSS:“{A764E898-518D-11d2-9A89-00C04F79EFC3}”
HTML:“ {58E975A0-F8FE-11D2-A6AE-00104BCC7269}”
JScript:“{59E2F421-410A-4fc9-9803-1F4E79216BE8}”
XAML:“{c9164055-039b-4669-832d-f257bd​​55518a78}”
XML:“20-f8a78 47b5-be1c-675b3c7f0b8e}"

注意:我发现默认情况下 JScript 语言服务被错误地映射到 HTML。

于 2011-03-14T00:15:14.680 回答