문제

나는 인터넷에서 언어 서비스를 제공하는 두 가지 방법을 발견했습니다.

첫 번째 방법 사용하는 것이 포함됩니다 IOleComponentManager 유휴 시간 동안 내 서비스에 전화할 수 있도록 타이머를 등록합니다.

두 번째 방법 내 서비스를 다음과 같이 포장하는 것과 관련이 있습니다. IServiceContainer 그리고 추가 ServiceCreatorCallback "요구에 따라 서비스를 제공"합니다.

아마도 두 번째 방법은 이제 작업을 수행하는 "선호되는 방법"입니다.안타깝게도 이 방법을 사용하면 OnSynchronizeDropdowns 내 전화는 절대 안 받아 TypeAndMembersDropdownBars 구현.

게다가 내 때는 LanguageService 파일에서 오류를 발견하면 다음을 사용합니다. ParseRequest.Sink.AddError() 오류 목록에 오류를 추가합니다."On Demand"를 제공할 때 이러한 오류는 코드를 통해 디버깅할 때 추가되는 것으로 보이지만 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:

메모이 방법은 자신의 타이머를 설정하고 타이머 핸들러 에서이 메소드를 호출하지 않는 한 호출되지 않습니다.

기본 메서드 호출 OnCaret이동됨 지난번 이후 캐럿이 이동 한 경우 유휴 상태 불렀다.그런 다음 기본 방법은 원천 현재 보기에 대한 개체입니다.현재의 경우 원천객체를 얻을 수없고, 기본 방법은 호출을 포함하여 전혀 아무것도하지 않습니다. OnCaret이동됨.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top