質問

インターネット上で言語サービスを提供する 2 つの方法を見つけました。

最初の方法 の使用が含まれます IOleComponentManager アイドル時間にサービスを呼び出すタイマーを登録します。

2番目の方法 私のサービスを IServiceContainer そして追加 ServiceCreatorCallback 「オンデマンドでサービスを提供する」こと。

おそらく 2 番目の方法が、現在では物事を行うための「推奨される方法」になっています。残念ながら、この方法を使用すると、 OnSynchronizeDropdowns 私に呼ばれることは決してありません TypeAndMembersDropdownBars 実装。

さらに、私の場合、 LanguageService ファイル内のエラーを見つけて使用します ParseRequest.Sink.AddError() エラーをエラーリストに追加します。「オンデマンド」を提供する場合、コードをデバッグするときにこれらのエラーが追加されているのが見えても、これらのエラーは GUI には表示されません。

構文の強調表示、「定義に移動」、および「すべての参照の検索」が引き続き機能するため、言語サービスが登録されていることがわかります。

「オンデマンドでサービスを提供する」ために使用しているコードは次のとおりです。

IServiceContainer serviceContainer = this as IServiceContainer;
ServiceCreatorCallback callback = new ServiceCreatorCallback(CreateLanguageService);
serviceContainer.AddService(typeof(MyLanguageService), callback, true);

誰かが私の機能の理由を教えてください LanguageService オンデマンドで提供する場合は機能しませんか?何かが足りないのでしょうか、それともその方法は完全に機能する言語サービスを意図していないだけでしょうか?

役に立ちましたか?

解決

少なくとも欠けている機能を使用するには、 IOleComponentManager 言語サービスを呼び出すタイマーを登録するメソッド アイドル期間.

使用する ドットピーク, 、 見つけた OnSynchronizeDropdowns() から電話がかかる OnCaretMoved() エディター内をクリックしたときに選択した項目を同期します。 OnCaretMoved() それ自体はからのみ呼び出されるようです LanguageService.OnIdle() この方法では、アイドル タイマーを使用する必要があると思います。

さらに詳しく調べたところ、エラー リストでは次のことが必要であることもわかりました。 ParseRequest.Reason に設定される ParseReason.Check, そうでない場合、呼び出しは無視されます。コードをもう少し調べてみると、解析理由が使用されていることがわかったのは、 Source.OnIdle().

アップデート: これら 2 つの機能にはアイドル タイマーの登録が必要であることが確認できたと思います。MSDNより LanguageService.OnIdle:

注記この方法は、独自のタイマーを設定し、タイマーハンドラーからこのメソッドを呼び出す場合を除き、呼び出されません。

基本メソッドの呼び出し キャレットが移動しました 前回から世話が移動した場合 アイドル時 と呼ばれていました。次に、ベースメソッドは、 ソース 現在のビューのオブジェクト。現在の場合 ソースオブジェクトを取得できず、ベースメソッドは呼び出しないことを含め、まったく何もしません キャレットが移動しました.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top