我刚刚将我的语言服务从VS2008迁移到了VS2010。一切正常,除了一件重要的事情:我不再为LanguageService.ParseSource
调用ParseReason.Check
。它在打开文件后会进行一次调用。但在编辑代码后,它不再被调用。
任何想法可能导致什么?
答案 0 :(得分:0)
我还从2008年到2010年迁移了语言服务。您能否检查一下您是否已经完成了所有这些步骤?
http://msdn.microsoft.com/en-us/library/dd885475.aspx
我没有做任何其他事情,我通过在更改前后在我们的软件仓库中区分重要文件来验证。
答案 1 :(得分:0)
我不知道你是否曾想过你的问题,但你是否尝试过确保你的Source类'LastParseTime在创建时设置为0?除非在创建Source对象时手动将LastParseTime设置为0,否则我似乎回想起Check not occurred的一些问题。
Protip:如果你使用.NET Reflector,你可以反汇编语言服务框架的所有基类,并很好地理解它是如何工作的。您感兴趣的课程位于Microsoft.VisualStudio.Package.LanguageService.10.0.dll中,该课程应安装在GAC中。我发现在尝试弄清楚为什么事情不能在我自己的语言服务中工作时,这是非常有用的,并且能够在调试器中逐步完成源代码减轻了使用这些框架的几乎所有痛苦! / p>
答案 2 :(得分:0)
初始化Source
对象后,它会以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();
}
}