0

言語サービスを VS2008 から VS2010 に移行しました。1 つの重要なことを除いて、すべて正常に動作LanguageService.ParseSourceParseReason.Checkます。ファイルを開いた後、単一の呼び出しを取得します。しかし、コードを編集すると、呼び出されなくなります。

それを引き起こしている可能性のあるアイデアはありますか?

4

3 に答える 3

0

また、言語サービスを2008年から2010年に移行しました。これらの手順をすべて許可したかどうかを確認できますか?

http://msdn.microsoft.com/en-us/library/dd885475.aspx

他に何もする必要はありませんでした。変更の前後にデポ内の重要なファイルを比較して確認しました。

于 2012-03-16T16:40:50.470 に答える
0

オブジェクトが初期化されると、 ofSourceで始まります。withを起動するコードは、値をチェックして、テキストが最後に変更されてからの時間が解析の実行にかかる時間 (または設定のいずれか長い方) よりも短いかどうかを確認します。LastParseTimeInt32.MaxValueParseRequestParseReason.CheckLastParseTimeCodeSenseDelay

からの応答を処理するコードParseSourceは を設定することになっていLastParseTimeますが、私が知る限りでは、ParseReasonCheck.

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();
    }
}
于 2014-02-27T16:30:32.333 に答える
0

あなたが質問を理解したことがあるかどうかわかりませんが、作成時に Source クラスの LastParseTime が 0 に設定されていることを確認しましたか? Source オブジェクトの作成時に LastParseTime を手動で 0 に設定しない限り、Check が発生しない問題がいくつかあったことを思い出すようです。

プロのヒント: .NET Reflector を使用すると、LanguageService フレームワークのすべての基本クラスを逆アセンブルして、内部ですべてがどのように機能するかをよく理解できます。関心のあるクラスは、GAC にインストールする必要がある Microsoft.VisualStudio.Package.LanguageService.10.0.dll にあります。これは、自分の言語サービスで機能しない理由を理解しようとするときに想像を絶するほど役立つことがわかりました。また、デバッガーでソース コードをステップ実行できるため、これらのフレームワークを操作する際のほとんどすべての苦痛が軽減されます。

于 2013-01-15T08:35:32.107 に答える