2012-07-03 5 views
6

एक सी # NPAPI प्लग इन का निर्माण करने का प्रयास में बिल्डिंग NPAPI प्लग इन मैं एक tutorial जो बताती है कि आपके dll NP_GetEntryPoints जैसे, NP_Initialize और NPP_New दूसरों के एक नंबर के साथ-साथ अनेक विधियों का लागू करने के लिए की जरूरत है मिल गया है।सी #

हालांकि मैं समझना चाहता हूं कि अगर मैं इन पद्धतियों के नामों को आसानी से मिरर कर सकता हूं और लेख में वर्णित समतुल्य डेटास्ट्रक्चर (जैसे _NPPluginFuncs) सी # में वर्णित कर सकता हूं और सबकुछ काम करेगा?

कोई व्यक्ति कृपया कुछ मार्गदर्शन प्रदान करने के लिए पर्याप्त दयालु हो सकता है? क्या सी # में एनपीएपीआई प्लगइन बनाना संभव है और यदि ऐसा है तो बुनियादी कदम क्या हैं?

+0

कोई भी वहां जीवित है? :-p –

+3

मैं आपको एनपीएपीआई पर विशेष रूप से विस्तृत उत्तर नहीं दे सकता, लेकिन सामान्य रूप से, सी-संगत निर्यातित कार्यों के साथ एक डीएलएल बनाने के लिए सी # का उपयोग करना संभव नहीं है। आप या तो 1) मिश्रित मोड C++ DLL बना सकते हैं, या (यदि आप प्रबंधित सी ++ की तुलना में सी # में अधिक आरामदायक होते हैं) 2) अपने निर्यात वाले एक छोटे देशी डीएलएल बनाएं, जो एक प्रबंधित असेंबली में प्रतिनिधि को इंटरऑप का उपयोग करता है सी # में और जिसमें आपकी कार्यक्षमता का बड़ा हिस्सा शामिल है। – shambulator

+0

अब मूल रूप से एक उत्तर है। मैंने माना कि एक बदतर मामले में कुछ प्रकार का इंटरऑप संभव होगा (हालांकि COM को मानने के लिए सी ++ के बारे में पर्याप्त जानकारी नहीं थी) लेकिन मुझे यह भी लगा कि सी ++ और सी # –

उत्तर

4

के रूप में दस्तावेज में कहा गया है:,

एक NPAPI ब्राउज़र प्लगइन है यह कोर इसका मतलब है कि आप में से कुछ समारोह का निर्यात करने की जरूरत है कुछ विशिष्ट प्रवेश बिंदुओं

साथ बस एक DLL है पर, एक नियमित डीएलएल, जो आमतौर पर सी/सी ++ में किया जाता है। दुर्भाग्य से सादे सी # डीएल, but look at this answer से किसी भी प्रविष्टि बिंदु का खुलासा करना संभव नहीं है, कुछ प्रयासों के साथ कुछ प्रकार के पोस्ट बिल्ड टूल द्वारा कुछ निर्यात को चालित करना संभव लगता है।

किसी भी मामले में प्लगइन इंटरफेस से/बहुत जटिल डेटा संरचनाओं को पारित करने की अपेक्षा न करें, यह दर्द होगा। यदि आप अधिक शोध करने में रुचि रखते हैं तो उपयोग करने के लिए महत्वपूर्ण कार्य "रिवर्स पी/इनवोक" है, जो सीधे पी/Invoke के साथ समानता में है जो प्रबंधित दुनिया से नियमित डीएल कॉल कर रहा है।

कारण एक सी # dll सीधे "प्रवेश बिंदुओं" का खुलासा नहीं कर सकते हैं कि प्रवेश बिंदु वास्तव में कुछ विधानसभा कोड तुरंत निष्पादन को dll poiting अंदर सिर्फ कुछ पता कर रहे हैं। सी # डीएल विभिन्न प्रकार के जानवर हैं: वे सिर्फ आईएल युक्त फाइलें हैं जिन्हें "जस्ट इन टाइम" संकलित किया गया है और वास्तव में इस तरह के संकलन को AFAIK with some OS tricks पर मजबूर किया गया है। यही कारण है कि रिवर्स पी/Invoke बिल्कुल स्टारलाइटवर्ड नहीं है।

+0

यह वास्तव में सटीक बयान है जो मुझे भ्रमित करता है "एक एनपीएपीआई ब्राउज़र प्लगइन, इसके मूल पर, कुछ विशिष्ट प्रविष्टि बिंदुओं के साथ बस एक डीएलएल है" - मेरा पहला विचार 'महान था, इसलिए मैं इसे सी # में लिख सकता हूं' मुझे लगता है कि मैं कभी नहीं वास्तव में इस बारे में सोचा कि डीएलएल कैसे 'एंट्री पॉइंट' लागू करता है और हमेशा यह मानता है कि सी ++ और सी # में 'एंट्री पॉइंट' वही काम करेगा। पीछे की ओर एक मूर्ख विचार में मैंने कभी सी ++ –

+0

@MaximGershkovich की एक पंक्ति नहीं लिखी है मैंने जवाब –

+0

अद्यतन किया है, धन्यवाद, मैं स्पष्टीकरण की सराहना करता हूं। –

4

जोर्ज Fritzsche उसकी टिप्पणी में कहते हैं:

NPAPI प्लग इन मूल रूप से कुछ के साथ DLLs हैं आवश्यक सी-निर्यात

और वहाँ कार्य (में निर्यात करने के लिए कोई अंतर्निहित तरीका है सी-निर्यात भावना) सी # में लिखी एक असेंबली से।

अपने विकल्पों में से कुछ हैं:

  1. एक मिश्रित मोड सी ++ विधानसभा जो कार्यों सीधे निर्यात कर सकते हैं। आपके प्लगइन की मेजबान प्रक्रिया में सीएलआर की मेजबानी के लिए इसका असर हो सकता है।
  2. निर्यात करने वाले छोटे मूल डीएलएल, फिर प्लग इंटरफ़ेस युक्त सी # असेंबली में प्रतिनिधि के लिए COM इंटरऑप का उपयोग करते हैं। तथाकथित "रिवर्स पी/इनवॉक" करने के लिए "आधिकारिक" तरीका।
  3. एक intriguing project जो आपकी पूरी तरह से प्रबंधित असेंबली को पोस्ट-प्रोसेस करता है, नामित फ़ंक्शन निर्यात में कस्टम विशेषता के साथ चिह्नित स्थिर विधियों को बदलता है। (मुझे इस प्रोजेक्ट के साथ कोई संबद्धता नहीं है; मुझे यह सोचने के बाद कि मैं किसी चीज करने के COM इंटरपॉप तरीके से सुधार हुआ था, मैं इसे खत्म कर दिया।)
+0

धन्यवाद, यह उस प्रश्न में खुदाई में है जो मैं वास्तव में पूछ रहा था लेकिन मुझे नहीं पता था कि कैसे व्यक्त किया जाए। –