3

如何在代码编辑器中从扩展中添加/删除代码?

例如:
我创建了一个扩展程序,它修改来自传入套接字的代码
示例使用 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() 函数失败

4

2 回答 2

3

这里的问题是您正试图ITextBuffer从与拥有它的线程不同的线程上进行编辑。这根本不可能。 ITextBuffer一旦发生第一次编辑,实例就会被关联到特定线程,并且在那之后它们不能从不同的线程进行编辑。关联后,该TakeThreadOwnership方法也将失败ITextBuffer。大多数其他非编辑方法(CurrentSnapshot例如)可以从任何线程调用。

通常ITextBuffer将与 Visual Studio UI 线程关联。因此,要执行编辑,请使用原始SynchronizationContext.Current实例或Dispatcher.CurrentDispatcher从 UI 线程返回到 UI 线程,然后执行编辑。

于 2010-12-01T19:37:19.513 回答
1

这是我想出的代码

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();
        }));
于 2012-12-12T13:27:49.953 回答