.net 将代码添加到visual studio包/扩展中的当前编辑器窗口

.net 将代码添加到visual studio包/扩展中的当前编辑器窗口,.net,visual-studio,vsix,.net,Visual Studio,Vsix,如何在代码编辑器中从扩展添加/删除代码 例如: 我创建了一个扩展开关,用于修改来自传入套接字的代码 该示例使用Microsoft.VisualStudio.Text.Editor 尝试使用: IWPTextView textView;//从visual studio“创建”事件中获取 ITextChange;//从网络套接字或其他源获取 ITextEdit edit=textView.TextBuffer.CreateEdit();//抛出“非所有者”异常 编辑.删除(change.OldSp

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

例如:
我创建了一个扩展开关,用于修改来自传入套接字的代码
该示例使用Microsoft.VisualStudio.Text.Editor

尝试使用:

IWPTextView textView;//从visual studio“创建”事件中获取 ITextChange;//从网络套接字或其他源获取

ITextEdit edit=textView.TextBuffer.CreateEdit();//抛出“非所有者”异常 编辑.删除(change.OldSpan); 编辑.插入(change.NewPosition,change.NewText);


但是我想还有另一种方法,因为CrateEdit()函数失败了。这里的问题是,您试图从拥有它的线程以外的线程对
ITextBuffer
进行编辑。这根本不可能
ITextBuffer
实例在第一次编辑时与特定线程密切相关,之后无法从其他线程编辑它们。
ITextBuffer
被亲合后,
TakeThreadOwnership
方法也将失败。大多数其他非编辑方法(
CurrentSnapshot
)都可以从任何线程调用


通常,
ITextBuffer
将与VisualStudioUI线程密切相关。因此,要执行编辑,请使用UI线程中的原始
SynchronizationContext.Current
实例或
Dispatcher.CurrentDispatcher
,返回UI线程,然后执行编辑

这是我想出来的代码

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();
        }));

您可以发布完整的错误消息吗?错误:试图在错误的线程上编辑TextBuffer。和“textView.TextBuffer.TakeThreadOwnership();”抛出:试图更改TextBuffer的编辑线程。