VSIX, как получить текущее имя документа моментального снимка?

Я пытался создать расширение, которое выделяет для меня определенные номера строк в Visual Studio на полях.

Мне удалось получить свою маркировку на полях, используя предопределенный номер строки, но для правильной работы мне нужно знать, что такое полное имя текущего документа (путь и имя файла)

После долгих поисков я понял, как это сделать с примером кода (который не идеален)

DTE2 dte = (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.15.0");

var activeDocument = dte.ActiveDocument;

var docName = activeDocument.Name;
var docFullName = activeDocument.FullName;

Теперь я знаю проблемы здесь

  • это для конкретной версии, основанной на тексте
  • нет возможности выбрать экземпляр (при запуске более одного VS)
  • Кажется, это очень медленно

У меня есть ощущение, что я должен делать это с атрибутами MEF, но примеры документов MS настолько просты, что они не работают для меня. Я также просмотрел несколько вопросов SO, и я просто не могу заставить их работать. В основном говорят о Services.. которого у меня нет и я понятия не имею как его получить.

В остальной части моего кода используется SnapshotSpans, как в примере. /a>, что отлично, если вам НЕ нужно знать имя файла.

Я никогда не занимался разработкой расширений. Пожалуйста, помогите мне сделать это правильно.


person Piotr Kula    schedule 01.10.2018    source источник


Ответы (1)


Вы можете использовать следующий код, чтобы получить файл из моментального снимка без каких-либо зависимостей.

    public string GetDocumentPath(Microsoft.VisualStudio.Text.ITextSnapshot ts)
    {
        Microsoft.VisualStudio.Text.ITextDocument textDoc;
        bool rc = ts.TextBuffer.Properties.TryGetProperty(
            typeof(Microsoft.VisualStudio.Text.ITextDocument), out textDoc);
        if (rc && textDoc != null)
            return textDoc.FilePath;
        return null;
    }

Если вы не против добавить Microsoft.CodeAnalysis.EditorFeatures.Text в свой проект, он предоставит вам метод расширения Document GetOpenDocumentInCurrentContextWithChanges() в классе Microsoft.VisualStudio.Text.Snapshot. (Плюс многие другие помощники на основе Rosyln)

using Microsoft.CodeAnalysis.Text;

Document doc = span.Snapshot.GetOpenDocumentInCurrentContextWithChanges();
person Sergey Vlasov    schedule 02.10.2018
comment
Спасибо, Сергей, это довольно бесценный код, который вы там предоставили. Я не уверен, где еще это можно задокументировать? Я также нашел еще один пост от кого-то об использовании пакетов анализа кода Rosylyn, который дает нам множество расширений, особенно Snapshot.GetOpenDocumentInCurrentContextWithChanges(), предоставленный в Microsoft.CodeAnalysis.EditorFeatures.Text - я полагаю, что это будет очень похожий код в том пакете, который вы только что предоставили - person Piotr Kula; 02.10.2018
comment
Надеюсь, вы не возражаете, что я добавил пример, чтобы сделать ваш ответ более полным. Спасибо! +1 - person Piotr Kula; 02.10.2018