Question

J'ai trouvé deux façons de proposer un service linguistique sur Internet.

La première façon implique d'utiliser un IOleComponentManager et enregistrer une minuterie pour appeler mon service pendant les périodes d'inactivité.

La deuxième façon implique de présenter mon service en tant que IServiceContainer et en ajoutant un ServiceCreatorCallback "proposer le service à la demande".

On suppose que la deuxième manière est désormais la « manière préférée » de faire les choses.Malheureusement, lorsque j'utilise cette méthode, OnSynchronizeDropdowns on ne m'appelle jamais TypeAndMembersDropdownBars mise en œuvre.

De plus, quand mon LanguageService trouve des erreurs dans le fichier, il utilise ParseRequest.Sink.AddError() pour ajouter des erreurs à la liste des erreurs.Lorsque vous proposez "À la demande", ces erreurs n'apparaissent pas dans l'interface graphique, même si je les vois ajoutées lorsque je débogue via le code.

Je sais que mon service linguistique est en cours d'enregistrement, car la coloration syntaxique, "Aller à la définition" et "Rechercher toutes les références" fonctionnent toujours.

Voici le code que j'utilise pour "proposer mon service à la demande" :

IServiceContainer serviceContainer = this as IServiceContainer;
ServiceCreatorCallback callback = new ServiceCreatorCallback(CreateLanguageService);
serviceContainer.AddService(typeof(MyLanguageService), callback, true);

Quelqu'un peut-il me dire pourquoi certaines fonctionnalités de mon LanguageService ne fonctionne pas lorsqu'on le propose à la demande ?Est-ce que j'ai raté quelque chose, ou cette méthode n'est-elle tout simplement pas destinée à un service linguistique entièrement fonctionnel ?

Était-ce utile?

La solution

Il semble qu'au moins la fonctionnalité manquante nécessite l'utilisation du IOleComponentManager méthode qui enregistre une minuterie pour appeler le service de langage pendant périodes d'inactivité.

En utilisant pointPeek, Je l'ai trouvé OnSynchronizeDropdowns() est appelé de OnCaretMoved() pour synchroniser l'élément sélectionné lorsque vous cliquez dans l'éditeur. OnCaretMoved() lui-même semble être appelé uniquement depuis le LanguageService.OnIdle() méthode, qui, je crois, nécessite l'utilisation de la minuterie d'inactivité.

Après avoir creusé un peu plus, j'ai également découvert que la liste des erreurs exige que le ParseRequest.Reason être prêt à ParseReason.Check, sinon il ignore l'appel.En fouillant un peu plus dans le code, le seul endroit où j'ai trouvé que la raison d'analyse était utilisée était dans Source.OnIdle().

Mise à jour: Je crois avoir confirmé que l'enregistrement d'une minuterie d'inactivité est requis pour ces deux fonctionnalités.Depuis MSDN sur LanguageService.OnIdle:

NoteCette méthode n'est appelée que si vous configurez votre propre minuterie et appelez cette méthode à partir du gestionnaire de minuterie.

La méthode de base appelle SurCaretDéplacé Si le caret a déménagé depuis la dernière fois En veille a été appelé.La méthode de base appelle ensuite la méthode onIdle sur le Source objet pour la vue actuelle.Si le courant SourceL'objet ne peut pas être obtenu, la méthode de base ne fait rien du tout, y compris ne pas appeler SurCaretDéplacé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top