1

Classifier,ErrorTagger,SignatureHelpおよびTextCompletionクラスを作成しました。 VSが発見するMEF構成要素であるプロバイダーによってすべて作成されます。VSIXエディタ言語拡張コンポーネント間の状態を共有

質問は、これらのコンポーネント間でC#オブジェクトを共有して状態を共有し、各コンポーネントから同じテキストを再解析するのを保存できるようにすることです。これどうやってするの?編集中のファイルごとにこの状態が必要です。

VSはプロバイダーを検出し、それを使用してコンポーネントを作成します。しかし、どうやってそれらの間で状態を入れたり共有したりできますか?私はグローバルシングルトンを使用しましたが、複数のファイルがVSで編集されている場合、それらはすべて同じシングルトンを共有しますが、編集中のファイルごとに異なるインスタンスが必要です。

+0

'IServiceProvider'はこのトリックを行う必要があります。しかし、すべてが新しいVSで同じappdomainで実行されると、静的変数もちょうどうまくいくはずです... – leppie

答えて

1

一般的なアプローチの1つはITextViewITextBufferです。物事を入れるための一般的なバッグとして使用できるPropertiesプロパティがあります。GetOrCreateSignletonPropertyヘルパーもあります。 ITextBufferの変更を監視し、そのように構文解析する何らかの種類のコンポーネントを持つのが一般的です。そして、それぞれのコンポーネントはこの1テキストバッファオブジェクトを取得するだけです。

クラシファイアとタガーもIDisposableを実装することができ、かつITextViewsはクローズイベントを持っているので、それはちょうどあなた自身のタイプにITextBuffer/ITextViewからどこかの静的辞書を持っていると道という寿命を管理することも可能です。

いずれにしても - テストしてください。誤ってネジを締めて、ITextBufferまたはITextViewを漏らすのは非常に簡単です。

関連する問題