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 に答える