.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的编辑线程。