我剛剛將我的語言服務從VS2008遷移到VS2010。除了一件重要的事情之外,一切正常:我不再爲ParseReason.Check
調用LanguageService.ParseSource
。打開文件後它會得到一個單獨的調用。但是在編輯代碼之後,它不再被調用。語言服務:ParseReason.Check在遷移到VS2010後從未調用過
任何想法可能會導致什麼?
我剛剛將我的語言服務從VS2008遷移到VS2010。除了一件重要的事情之外,一切正常:我不再爲ParseReason.Check
調用LanguageService.ParseSource
。打開文件後它會得到一個單獨的調用。但是在編輯代碼之後,它不再被調用。語言服務:ParseReason.Check在遷移到VS2010後從未調用過
任何想法可能會導致什麼?
我還將語言服務從2008年遷移至2010年。您可以檢查您是否已完成所有這些步驟?
http://msdn.microsoft.com/en-us/library/dd885475.aspx
我沒有做任何事情一樣,這是我以前用在我們的倉庫版本比較重要的文件和變更後的驗證。
我不知道你是否想過你的問題,但你有沒有試過確保你的Source類的LastParseTime在創建時被設置爲0?我似乎回想起檢查沒有發生的一些問題,除非在創建Source對象時手動將LastParseTime設置爲0。 Protip:如果你使用.NET Reflector,你可以反彙編LanguageService框架的所有基類,並且很好地理解它們是如何工作的。您感興趣的類將生活在Microsoft.VisualStudio.Package.LanguageService.10.0.dll中,它應該安裝在GAC中。當我試圖弄清楚爲什麼事情在我自己的語言服務中不起作用,並且能夠在調試器中逐步完成源代碼時,我發現這是無法想象的幫助,可以緩解使用這些框架的幾乎所有的痛苦!
當您的Source
對象被初始化時,它將以Int32.MaxValue
的LastParseTime
開頭。引起ParseRequest
與ParseReason.Check
錯誤的代碼將檢查LastParseTime
值,以查看自上次更改文本以來的時間是否小於運行解析所花費的時間(或CodeSenseDelay
設置,以較大者爲準)。
處理來自ParseSource
響應中的代碼應該設置LastParseTime
,但據我所知,它只做如果ParseReason
是Check
。
當初始化您的Source
時,您可以通過設置Source.LastParseTime = 0
來解決此問題。即使第一個解析尚未完成,這也具有將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();
}
}
對此有何好運? – ColinCren 2012-03-26 20:23:50