Pregunta

He encontrado dos formas de ofrecer un servicio lingüístico en Internet.

la primera manera implica utilizar un IOleComponentManager y registrar un temporizador para llamar a mi servicio durante los tiempos de inactividad.

la segunda manera Implica presentar mi servicio como un IServiceContainer y agregando un ServiceCreatorCallback "ofrecer el servicio a la carta".

Supuestamente la segunda forma es ahora la "forma preferida" de hacer las cosas.Desafortunadamente, cuando uso este método, OnSynchronizeDropdowns nunca me llaman TypeAndMembersDropdownBars implementación.

Además, cuando mi LanguageService encuentra errores en el archivo, utiliza ParseRequest.Sink.AddError() para agregar errores a la lista de errores.Al ofrecer "On Demand", estos errores no aparecen en la GUI, aunque veo que se agregan cuando depuro el código.

Sé que mi servicio de idiomas se está registrando porque el resaltado de sintaxis, "Ir a definición" y "Buscar todas las referencias" aún funcionan.

Aquí está el código que estoy usando para "ofrecer mi servicio bajo demanda":

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

¿Alguien puede decirme por qué algunas funciones de mi LanguageService ¿No funciona cuando se ofrece a pedido?¿Me estoy perdiendo algo o simplemente no es así para un servicio lingüístico completamente funcional?

¿Fue útil?

Solución

Parece que al menos la funcionalidad que falta requiere el uso de IOleComponentManager método que registra un temporizador para llamar al servicio de idiomas durante periodos inactivos.

Usando puntoPeek, Encontre eso OnSynchronizeDropdowns() recibe una llamada de OnCaretMoved() para sincronizar el elemento seleccionado cuando hace clic en el editor. OnCaretMoved() en sí mismo parece ser llamado sólo desde el LanguageService.OnIdle() método, que creo que requiere el uso del temporizador de inactividad.

Después de investigar un poco más, también descubrí que la lista de errores requiere que el ParseRequest.Reason Estar configurado en ParseReason.Check, de lo contrario ignora la llamada.Examinando un poco más el código, el único lugar donde encontré que se estaba utilizando el motivo del análisis fue en Source.OnIdle().

Actualizar: Creo que he confirmado que es necesario registrar un temporizador inactivo para estas dos funciones.De MSDN en adelante Servicio de idioma.OnIdle:

NotaNo se llama a este método a menos que configure su propio temporizador y llame a este método desde el controlador de temporizador.

El método base llama EnCaretMovido Si el símbolo de intercalación se ha movido desde la última vez que Hora En reposo fue llamado.A continuación, el método base llama al método OnIdle En el Fuente objeto para la vista actual.si el actual Fuente objeto no se puede obtener, el método base no hace nada en absoluto, incluyendo no llamar EnCaretMovido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top