القضايا التي تقدم خدمة اللغة
سؤال
لقد وجدت طريقتين لتقديم خدمة اللغة على شبكة الإنترنت.
الطريقة الأولى ينطوي على استخدام أ IOleComponentManager
وتسجيل مؤقت للاتصال بخدمتي أثناء أوقات الخمول.
الطريقة الثانية يتضمن غلاف خدمتي ك IServiceContainer
وإضافة أ ServiceCreatorCallback
"لتقديم الخدمة عند الطلب".
من المفترض أن الطريقة الثانية هي الآن "الطريقة المفضلة" لفعل الأشياء.لسوء الحظ، عندما أستخدم هذه الطريقة، OnSynchronizeDropdowns
لا يتم الاتصال بي أبدًا TypeAndMembersDropdownBars
تطبيق.
وبالإضافة إلى ذلك، عندما بلدي LanguageService
يجد أخطاء في الملف، فإنه يستخدم ParseRequest.Sink.AddError()
لإضافة أخطاء إلى قائمة الأخطاء.عند تقديم "عند الطلب"، لا تظهر هذه الأخطاء في واجهة المستخدم الرسومية، على الرغم من أنني أراها تتم إضافتها عندما أقوم بتصحيح الأخطاء من خلال التعليمات البرمجية.
أعلم أنه يتم تسجيل خدمة اللغة الخاصة بي، لأن تمييز بناء الجملة و"الانتقال إلى التعريف" و"البحث عن جميع المراجع" لا يزال يعمل.
إليك الرمز الذي أستخدمه "لعرض خدمتي عند الطلب":
IServiceContainer serviceContainer = this as IServiceContainer;
ServiceCreatorCallback callback = new ServiceCreatorCallback(CreateLanguageService);
serviceContainer.AddService(typeof(MyLanguageService), callback, true);
هل يمكن لأحد أن يقول لي لماذا بعض وظائف بلدي LanguageService
لا يعمل عند تقديمه عند الطلب؟هل أفتقد شيئًا ما، أم أن هذه الطريقة ليست مخصصة لخدمة لغة كاملة الوظائف؟
المحلول
يبدو أن الوظيفة المفقودة تتطلب على الأقل استخدام ملف IOleComponentManager
الطريقة التي تسجل مؤقتًا للاتصال بخدمة اللغة أثناء ذلك فترات الخمول.
استخدام com.dotPeek, لقد وجدت ذلك OnSynchronizeDropdowns()
يتم الاتصال به من OnCaretMoved()
لمزامنة العنصر المحدد عند النقر فوقه في المحرر. OnCaretMoved()
يبدو أنه يتم استدعاؤه فقط من LanguageService.OnIdle()
الطريقة التي أعتقد أنها تتطلب استخدام مؤقت الخمول.
بعد البحث أكثر، وجدت أيضًا أن قائمة الأخطاء تتطلب حذف ملف ParseRequest.Reason
يتم ضبطه على ParseReason.Check
, وإلا فإنه يتجاهل المكالمة.من خلال البحث في الكود أكثر، المكان الوحيد الذي وجدت فيه سبب التحليل المستخدم هو Source.OnIdle()
.
تحديث: أعتقد أنني أكدت أن تسجيل مؤقت خامل مطلوب لهاتين الوظيفتين.من MSDN على LanguageService.OnIdle:
ملحوظةلا يتم استدعاء هذه الطريقة إلا إذا قمت بإعداد المؤقت الخاص بك واستدعاء هذه الطريقة من معالج المؤقت.
تستدعي الطريقة الأساسية OnCaretMoved إذا انتقلت الكاريت منذ آخر مرة في حالة السكون كان يسمى.ثم تستدعي الطريقة الأساسية طريقة OnIdle على مصدر كائن للعرض الحالي.إذا كان الحالي مصدرلا يمكن الحصول على الكائن ، لا تفعل الطريقة الأساسية شيئًا على الإطلاق ، بما في ذلك عدم الاتصال OnCaretMoved.