言語サービスを VS2008 から VS2010 に移行しました。1 つの重要なことを除いて、すべて正常に動作LanguageService.ParseSource
しParseReason.Check
ます。ファイルを開いた後、単一の呼び出しを取得します。しかし、コードを編集すると、呼び出されなくなります。
それを引き起こしている可能性のあるアイデアはありますか?
言語サービスを VS2008 から VS2010 に移行しました。1 つの重要なことを除いて、すべて正常に動作LanguageService.ParseSource
しParseReason.Check
ます。ファイルを開いた後、単一の呼び出しを取得します。しかし、コードを編集すると、呼び出されなくなります。
それを引き起こしている可能性のあるアイデアはありますか?
また、言語サービスを2008年から2010年に移行しました。これらの手順をすべて許可したかどうかを確認できますか?
http://msdn.microsoft.com/en-us/library/dd885475.aspx
他に何もする必要はありませんでした。変更の前後にデポ内の重要なファイルを比較して確認しました。
オブジェクトが初期化されると、 ofSource
で始まります。withを起動するコードは、値をチェックして、テキストが最後に変更されてからの時間が解析の実行にかかる時間 (または設定のいずれか長い方) よりも短いかどうかを確認します。LastParseTime
Int32.MaxValue
ParseRequest
ParseReason.Check
LastParseTime
CodeSenseDelay
からの応答を処理するコードParseSource
は を設定することになっていLastParseTime
ますが、私が知る限りでは、ParseReason
がCheck
.
Source.LastParseTime = 0
を初期化するときに設定することで、この問題を回避できますSource
。これには、最初の解析がまだ終了していなくても、に設定CompletedFirstParse
するという副作用があります。true
この問題を解決する別の方法は、オーバーライドSource.OnIdle
して最初の呼び出しを開始BeginParse()
することです。これが私が推奨する方法です。
public override void OnIdle(bool periodic)
{
// Once first "Check" parse completes, revert to base implementation
if (this.CompletedFirstParse)
{
base.OnIdle(periodic);
}
// Same as base implementation, except we don't check lastParseTime
else if (!periodic || this.LanguageService == null || this.LanguageService.LastActiveTextView == null || (this.IsCompletorActive) || (!this.IsDirty || this.LanguageService.IsParsing))
{
this.BeginParse();
}
}
あなたが質問を理解したことがあるかどうかわかりませんが、作成時に Source クラスの LastParseTime が 0 に設定されていることを確認しましたか? Source オブジェクトの作成時に LastParseTime を手動で 0 に設定しない限り、Check が発生しない問題がいくつかあったことを思い出すようです。
プロのヒント: .NET Reflector を使用すると、LanguageService フレームワークのすべての基本クラスを逆アセンブルして、内部ですべてがどのように機能するかをよく理解できます。関心のあるクラスは、GAC にインストールする必要がある Microsoft.VisualStudio.Package.LanguageService.10.0.dll にあります。これは、自分の言語サービスで機能しない理由を理解しようとするときに想像を絶するほど役立つことがわかりました。また、デバッガーでソース コードをステップ実行できるため、これらのフレームワークを操作する際のほとんどすべての苦痛が軽減されます。