VSIX, как получить имя текущего снимка документа? - PullRequest
0 голосов
/ 01 октября 2018

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

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

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

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 настолько просты, что они не работают для меня.Я тоже отсканировал несколько ТАКИХ вопросов и просто не могу заставить их работать.В основном они говорят о Services .. которого у меня нет, и я не знаю, как его получить.

В остальной части моего кода используется SnapshotSpans, как в примере Расширение Примеры Todo_Classification это здорово, если вам НЕ нужно знать имя файла.

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

1 Ответ

0 голосов
/ 02 октября 2018

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

    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 класс.(Плюс многие другие помощники из Росилна)

using Microsoft.CodeAnalysis.Text;

Document doc = span.Snapshot.GetOpenDocumentInCurrentContextWithChanges();
...