我发现了两种在互联网上提供语言服务的方法。

第一种方式 涉及使用 IOleComponentManager 并注册一个计时器以在空闲时间调用我的服务。

第二种方式 涉及将我的服务包装为 IServiceContainer 并添加一个 ServiceCreatorCallback “按需提供服务”。

据说第二种方式现在是做事的“首选方式”。不幸的是,当我使用这种方法时, 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().

更新: 我相信我已经确认这两项功能需要注册空闲计时器。来自MSDN LanguageService.OnIdle:

笔记除非您设置自己的计时器并从计时器处理程序调用此方法,否则不会调用此方法。

基本方法调用 插入符号移动 如果看门自从上次移动 空闲时 被称为。然后,基本方法调用onidle方法 来源 当前视图的对象。如果当前 来源无法获得对象,基本方法根本没有任何作用,包括不打电话 插入符号移动.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top