2013-01-04 9 views
12

मैं एक नया ऐड परियोजना बनाने के लिए विज़ार्ड "दृश्य स्टूडियो के लिए ऐड-में" इस्तेमाल किया और अब, मैं कुछ ईवेंट हैंडलर्स जोड़ने के लिए कोशिश कर रहा हूँ:ऐड-में घटनाओं कभी नहीं क्रियान्वित कर रहे हैं

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) 
{ 
    _applicationObject = (DTE2)application; 
    _addInInstance = (AddIn)addInInst; 

    _applicationObject.Events.BuildEvents.OnBuildBegin += BuildEvents_OnBuildBegin; 
    _applicationObject.Events.BuildEvents.OnBuildDone += BuildEvents_OnBuildDone; 
    _applicationObject.Events.SelectionEvents.OnChange += SelectionEvents_OnChange; 
    _applicationObject.Events.DocumentEvents.DocumentOpened += DocumentEvents_DocumentOpened; 
    _applicationObject.Events.DocumentEvents.DocumentSaved += DocumentEvents_DocumentSaved; 
} 

लेकिन जो कुछ भी मैं करता हूं, मेरे हैंडलर कभी निष्पादित नहीं होते हैं!

क्या मैं अंधा हूं? क्या मुझे इन हैंडलर को पंजीकृत करने के लिए कुछ और करना है या यह क्यों काम नहीं करता है?

+0

मैं कभी कभी एक ही समस्या है ....। कभी-कभी जब मैं तैनाती करता हूं, घटनाएं काम करती हैं .. और कभी-कभी नहीं। कुछ समझ नहीं आया। – Earlz

+1

BuildEvents के लिए: यह API .NET Framework आधारभूत संरचना का समर्थन करता है और इसका उद्देश्य सीधे आपके कोड से उपयोग नहीं करना है। केवल माइक्रोसॉफ्ट आंतरिक उपयोग। – jessehouwing

+0

शायद _applicationObject कचरा एकत्र किया जा रहा है? –

उत्तर

19

लगता है कि आप कचरा कलेक्टर का शिकार हैं। देखें: http://www.mztools.com/articles/2005/mz2005012.aspx

private readonly BuildEvents _buildEvents; 
private readonly SelectionEvents _selectionEvents; 
private readonly DocumentEvents _documentEvents; 
private readonly Events _events; 

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) 
{ 
    _applicationObject = (DTE2)application; 
    _addInInstance = (AddIn)addInInst; 
    _events = _applicationObject.Events; 

    _buildEvents = _events.BuildEvents; 
    _buildEvents.OnBuildBegin += BuildEvents_OnBuildBegin; 
    _buildEvents.OnBuildDone += BuildEvents_OnBuildDone; 

    _selectionEvents = _events.SelectionEvents; 
    _selectionEvents.OnChange += SelectionEvents_OnChange; 

    _documentEvents = _events.DocumentEvents; 
    _documentEvents.DocumentOpened += DocumentEvents_DocumentOpened; 
    _documentEvents.DocumentSaved += DocumentEvents_DocumentSaved; 
} 
+1

यह मामला प्रतीत नहीं होता है। डिफ़ॉल्ट रूप से, ऐड-इन विज़ार्ड इसे बना देगा ताकि दिखाया गया '_applicationObject' क्लास स्तर पर बनाया गया है, स्थानीय चर के रूप में नहीं – Earlz

+0

न केवल _applicationObject, लेकिन आपको क्लास लेवल पर BuildEvents, SelectionEvents और DocumentEvents को स्ट्रोर करने की आवश्यकता है भी। – jessehouwing

+0

@ जेसेहौविंग मैंने दस्तावेज़वेन्ट्स के साथ इसका परीक्षण किया। मदद नहीं की –

1

आप डीबगर में applicationObject को देखें, तो आप अपने एक COM वस्तु देखेंगे, लेकिन xxxEvents कक्षाएं नहीं (आप OnConnection पर तोड़ने के लिए कोड नहीं मिल सकता है, तो संभवतः हैं जब आप डीबग करते हैं तो आपका एडिन लोड नहीं हो रहा है, टूल मेनू की जांच करें)

COM में ईवेंट को एक अलग COM इंटरफ़ेस (इस मामले में कई) द्वारा नियंत्रित किया जाता है जो सर्वर (वीएस) उन्हें आग लगाने के लिए कहते हैं ।

हालांकि COM ऑब्जेक्ट विधानसभाओं CLR करने के लिए वे अप्रबंधित कोड आंतरिक रूप से, इसलिए प्रबंधित वस्तुओं को जड़ों को रोक नहीं सकते हैं एक ऐसी ही टाइप किए हुए विधानसभा अवधारणा है।

तो हालांकि आप किसी प्रतिनिधि को एक COM ईवेंट में हुक कर सकते हैं जो कि मूल सीएलआर ईवेंट की तरह दिखता है, आपका ईवेंट आरसीडब्ल्यू (रनटाइम कॉल करने योग्य रैपर) से जुड़ा हुआ है। सर्वर से आरसीडब्ल्यू कॉम इंटरफ़ेस में एक COM संदर्भ है, लेकिन सीएलआर रूट के बिना आरसीडब्ल्यू अंततः डिस्प्ले हो जाता है जो कॉम इंटरफ़ेस को अनलोड करता है, जिसके बाद आप किसी भी ईवेंट को डुबो नहीं देंगे।

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन मैं यह सामान्य रूप से काम करता है जब आप ऐसा अपने शायद वजह से कैसे DTE COM इंटरफेस संरचित है करने के लिए अपने घटना इंटरफेस के लिए एक सीधा संघ के साथ एक एकल COM वस्तु का उपभोग लगता है ...

वैसे भी जैसा कि अन्य ने कहा है कि आपको ऐप ऑब्जेक्ट से इसे ठीक करने के लिए BuildEvents, SelectionEvents और DocumentEvents कक्षाओं के किसी भी प्रकार के प्रबंधित संदर्भ की आवश्यकता है। वीएस के कई उदाहरणों को जोड़ने के अलग-अलग उदाहरण लोड करते हैं ताकि आप स्थिर ऑब्जेक्ट रेफरी की एक सूची जोड़ सकें और उन्हें ऑनकनेक्ट में सेट कर सकें।

Subscription to DTE events doesn't seem to work - Events don't get called

http://msdn.microsoft.com/en-us/library/k639e386.aspx

संबंधित मुद्दे