2010-12-01 27 views
3

拡張機能のコードエディタでコードを追加/削除するにはどうすればよいですか?例えばVisual Studioの現在のエディタウィンドウにコードを追加するパッケージ/拡張子


私は拡張魔法使いが使用してみました例では、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()関数が失敗するため、別の方法があると思います。

+0

を把握コードはありますか? – JaredPar

+0

エラー:間違ったスレッドでTextBufferを編集しようとしました。 "textView.TextBuffer.TakeThreadOwnership();" throws: TextBufferの編集スレッドを変更しようとしました。 –

答えて

3

ここでの問題はあなたがそれを所有しているスレッドとは別のスレッドからITextBufferの編集をしようとしています。これは単に不可能です。 ITextBufferインスタンスは、最初の編集が行われると特定のスレッドにアフィニティ化され、そのポイントの後は別のスレッドから編集できません。 TakeThreadOwnershipメソッドは、ITextBufferがアフィニティ化された後も失敗します。ほとんどの他の非編集メソッド(例えばCurrentSnapshot)は、どのスレッドからでも呼び出すことができます。

通常、Visual Studio UIスレッドには、がアフィニティ化されます。したがって、編集を実行するには、元のSynchronizationContext.CurrentインスタンスまたはDispatcher.CurrentDispatcherをUIスレッドから使​​用してUIスレッドに戻ってから編集を実行します。

+0

:Dありがとう! –

0

ここでは、完全なエラーメッセージを投稿することができ、私は

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(); 
     })); 
関連する問題