Я написал такую статистику (хотя только для C # и VB.NET), и оба вопроса очень сложны для всех типов проектов / типов файлов / языков.Прежде всего, если вам нужно, вы можете открыть EnvDTE.Document / EnvDTE.TextDocument из EnvDTE.ProjectItem, используя метод ProjectItem.Open (view), который возвращает EnvDTE.Window.Это не делает окно видимым, по умолчанию оно невидимо, вам нужно вызвать Window.Visible = true, чтобы сделать его видимым.Когда вы закончите, вы закроете (невидимое) окно с помощью Window.Close, если оно не было уже открыто (вы можете знать, вызывая сначала ProjectItem.get_IsOpen (view) и затем закрывая или нет соответственно).
Теперь:
Очень трудно узнать, является ли файл текстовым или нет, потому что VS поддерживает много проектов, и каждый тип проекта может рассматривать свои файлы / расширения кактекстовые файлы или нет.Наилучший подход, который я нашел, состоит в том, чтобы рассматривать все файлы как текстовые файлы, кроме известных расширений, которые не являются текстовыми файлами (.jpg и т. Д.).Также обратите внимание, что не все текстовые файлы являются файлами кода (например, файлы .txt).Для некоторых функций, таких как функция поиска текста, вас могут заинтересовать текстовые файлы, а для функции статистики вас могут заинтересовать файлы кода, а не только текстовые файлы.
Вы можете знатьguid языка файла, используя EnvDTE.ProjectItem.FileCodeModel.Language (и EnvDTE.Project.CodeModel.Language).Увы, некоторые проекты / файлы имеют язык, но не предоставляют модель кода, поэтому вам может потребоваться использовать известные расширения для сопоставления с языком.
Некоторые полезные языковые руководства:
const string LANGUAGE_CSHARP = "{B5E9BD34-6D3E-4B5D-925E-8A43B79820B4}";
const string LANGUAGE_IDL = "{B5E9BD35-6D3E-4B5D-925E-8A43B79820B4}";
const string LANGUAGE_MANAGED_C = "{B5E9BD36-6D3E-4B5D-925E-8A43B79820B4}";
const string LANGUAGE_VBNET = "{B5E9BD33-6D3E-4B5D-925E-8A43B79820B4}";
const string LANGUAGE_VISUAL_C = "{B5E9BD32-6D3E-4B5D-925E-8A43B79820B4}";
const string LANGUAGE_PYTHON = "{888888A0-9F3D-457C-B088-3A5042F75D52}";
const string LANGUAGE_FSHARP = "{F2A71F9B-5D33-465A-A702-920D77279786}";
const string LANGUAGE_R = "{DA7A21FA-8162-4350-AD77-A8D1B671F3ED}";
Обратите внимание, что, поскольку VS настолько расширяемо, для языков нет перечисления.Новые языки обеспечивают новые направляющие.