यहां चुनौती है। मैं फ्रेमवर्क की WebBrowserSite
कक्षा से प्राप्त कर रहा हूं। मेरी व्युत्पन्न कक्षा का एक उदाहरण, ImprovedWebBrowserSite
, WebBrowser.CreateWebBrowserSiteBase
के माध्यम से वापस किया गया है, जिसे मैं WebBrowser
कक्षा के अपने व्युत्पन्न संस्करण में ओवरराइड करता हूं - विशेष रूप से कस्टम साइट ऑब्जेक्ट प्रदान करने के लिए। फ्रेमवर्क का WebBrowser
कार्यान्वयन आगे अंतर्निहित अप्रबंधित WebBrowser ActiveX नियंत्रण तक पहुंच जाता है।WebBrowserSite: व्युत्पन्न कक्षा में एक निजी COM इंटरफ़ेस विधि को कैसे कॉल करें?
अब तक, मैंने IDocHostUIHandler
को ImprovedWebBrowserSite
कार्यान्वयन (जैसे this) में ओवरराइड करने में कामयाब रहा है। अब मैं अधिक कोर COM इंटरफ़ेस की तलाश कर रहा हूं, जैसे IOleClientSite
, जिसे मैं WebBrowserSite
पर पास-थ्रू करना चाहता हूं। उन सभी को ComImport
के साथ COM के संपर्क में लाया गया है, लेकिन फ्रेमवर्क के WebBrowserSite
/UnsafeNativeMethods
के कार्यान्वयन द्वारा private
या internal
के रूप में घोषित किया गया है। इस प्रकार, मैं व्युत्पन्न कक्षा में explicitly re-implement नहीं कर सकता। मुझे अपने खुद के संस्करणों को परिभाषित करना है, जैसे मैंने IDocHostUIHandler
के साथ किया था।
तो सवाल यह है कि, मैं अपने व्युत्पन्न वर्ग से WebBrowserSite
में परिभाषित निजी या आंतरिक COM इंटरफ़ेस की विधि कैसे कॉल करूं? उदाहरण के लिए, मैं IOleClientSite.GetContainer
पर कॉल करना चाहता हूं। मैं प्रतिबिंब का उपयोग कर सकता हूं (जैसे this), लेकिन यह आखिरी उपाय होगा, दूसरा स्क्रैच से WebBrowser
को फिर से कार्यान्वित करने के लिए दूसरा होगा।
मेरे सोच, है फ्रेमवर्क के निजी UnsafeNativeMethods.IOleClientSite
और अपने ImprovedWebBrowserSite.IOleClientSite
दोनों कॉम इंटरफेस, ComImport
विशेषता, एक ही GUID और समान विधि हस्ताक्षरों के साथ घोषित कर रहे हैं क्योंकि। .NET 4.0+ में COM Type Equivalence है, इसलिए प्रतिबिंब के बिना इसे करने का कोई तरीका होना चाहिए।
[अद्यतन] अब जब कि मैं एक solution मिल गया है, मेरा मानना है कि यह WebBrowser
की WinForms version नियंत्रण को अनुकूलित में कुछ नए और दिलचस्प संभावनाओं को खोलता है।
प्रश्न का यह संस्करण my initial attempt के बाद बनाया गया था ताकि अधिक सार तत्व में समस्या को तैयार करने के लिए एक कमेंटेटर द्वारा भ्रामक कहा जा सके। टिप्पणी बाद में हटा दी गई है, लेकिन मैंने दोनों संस्करणों को रखने का फैसला किया।
मैं इस समस्या को हल करने के लिए प्रतिबिंब का उपयोग क्यों नहीं करना चाहता था? कुछ कारणों के लिए:
निर्भरता के रूप में एक COM इंटरफेस, द्विआधारी v-तालिका अनुबंध के बारे में है जिसके साथ विपरीत,
WebBrowserSite
के कार्यान्वयन के द्वारा दिए गए आंतरिक या निजी तरीकों की वास्तविक प्रतीकात्मक नाम, पर।भारी प्रतिबिंब कोड। उदाहरण के लिए, बेस के निजी
TranslateAccelerator
कोType.InvokeMember
के माध्यम से कॉल करने पर विचार करें, और मेरे पास कॉल करने के लिए ~ 20 तरीके हैं।हालांकि कम महत्वपूर्ण, दक्षता: प्रतिबिंब के माध्यम से देर से कॉल किया गया कॉल वी-टेबल के माध्यम से एक COM इंटरफ़ेस विधि को सीधे कॉल से हमेशा कम कुशल होता है।
कारण है कि आप उन्हें ओवरराइड करना चाहते हैं और नहीं बस उनकी घोषणाओं कॉपी-पेस्ट करते हैं? – VladL
@VladL, [.NET 4.x स्रोत] पर एक नज़र डालें (http://referencesource.microsoft.com/netframework.aspx)। 'WebBrowserSite' ActiveX होस्टिंग के रूप में बहुत सी चीजें करता है, मैं केवल COM इंटरफेस के कार्यान्वयन को कॉल नहीं कर सकता। मैं निश्चित रूप से इंटरफ़ेस घोषणाओं को कॉपी-पेस्ट कर सकता हूं, लेकिन मुझे मूल कार्यान्वयन भी कॉल करना होगा। – Noseratio
मुझे नहीं लगता कि आप गैर सार्वजनिक प्रकारों के बीच समानता प्राप्त कर सकते हैं। यदि आप एक गैर-सार्वजनिक प्रकार में TypeIdentifier विशेषता जोड़ने का प्रयास करते हैं, तो आपको इस प्रकार की त्रुटि मिल जाएगी: "असेंबली 'blabla ...' से 'IOleClientSite' प्रकार लोड नहीं किया जा सका। प्रकार को टाइप समतुल्य के लिए योग्य के रूप में चिह्नित किया गया है, लेकिन इसे सार्वजनिक के रूप में चिह्नित नहीं किया गया है। " –