Добавить код в текущее окно редактора в пакете Visual Studio / расширение - PullRequest
3 голосов
/ 01 декабря 2010

Как добавить / удалить код в редакторе кода из расширения?

Например:
Я создал расширение, которое изменяет код из входящего сокета
В примере используется Microsoft.VisualStudio.Text.Editor

Пробовал с помощью:

IWpfTextView textView; // got from visual studio "Create" event ITextChange change; // Got from network socket or other source

ITextEdit edit = textView.TextBuffer.CreateEdit(); // Throws "Not Owner" Exception edit.Delete(change.OldSpan); edit.Insert(change.NewPosition, change.NewText);

Но я думаю, что есть другой способ, потому что функция CrateEdit () завершается ошибкой

Ответы [ 2 ]

3 голосов
/ 01 декабря 2010

Проблема здесь в том, что вы пытаетесь редактировать ITextBuffer из другого потока, чем тот, которому он принадлежит.Это просто невозможно.ITextBuffer экземпляры аффинитизируются в определенном потоке после первого редактирования, и после этого момента они не могут быть отредактированы из другого потока.Метод TakeThreadOwnership также потерпит неудачу после аффинитизации ITextBuffer.Большинство других нередактирующих методов (например, CurrentSnapshot) можно вызывать из любого потока.

Обычно ITextBuffer будет аффинитизирован с потоком пользовательского интерфейса Visual Studio.Таким образом, чтобы выполнить редактирование, используйте оригинальный экземпляр SynchronizationContext.Current или Dispatcher.CurrentDispatcher из потока пользовательского интерфейса, чтобы вернуться в поток пользовательского интерфейса и затем выполнить редактирование.

0 голосов
/ 12 декабря 2012

Вот код, который я выяснил

Dispatcher.Invoke(new Action(() =>
        {

            ITextEdit edit = _view.TextBuffer.CreateEdit();
            ITextSnapshot snapshot = edit.Snapshot;

            int position = snapshot.GetText().IndexOf("text:");
            edit.Delete(position, 5);
            edit.Insert(position, "some text");
            edit.Apply();
        }));
...