Как определить тип языка ProjectItem, не открывая документ в vsx?
Когда файл открывается в редакторе Visual Studio, через свойство EnvDTE.Document.Language возвращается строковый результат, например "CSharp", "C/C++", "HTML", "JScript" и т. Д., С указанием языка файл. Я хотел бы иметь возможность доступа к той же языковой информации, когда файл не открыт (т.е. из контекста ProjectItem).
EnvDTE.ProjectItem.FileCodeModel.Language показался многообещающим, но дал только результат для файлов CSharp. Информация не была доступна для HTML, XAML и т. Д.
Я мог бы сделать предположения, основанные на расширениях файлов, но возможность получить язык, интерпретируемый Visual Studio (предположительно, через языковые службы), была бы намного более надежной. Кажется, что информация доступна, поскольку она хранится в документе, но я не смог найти подходящий API для доступа к ней.
Любая помощь или предложения будут с благодарностью.:)
1 ответ
Для всех, кто может наткнуться на это, я нашел подход, который будет работать. Мне все еще интересно узнать, есть ли у кого-нибудь более чистое решение.
- Импортируйте сборку Microsoft.VisualStudio.Package.LanguageService.9.0 (или эквивалентную).
- Создание редактора Factory
- Вызовите GetLanguageService для экземпляра EditorFactory, передав расширение элемента проекта (т.е. 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-f257bd5554d4}"
XML: "{f6819a78-a205-47b5-be1c-675b3c7f0b8e}"
Примечание. Я обнаружил, что языковая служба JScript по умолчанию неправильно отображена в HTML.