मैं एक अप्रबंधित सी ++ डीएलएल आयात करना चाहता हूं और एक पैरामीटर के रूप में stringstream
लेता हूं। सी # में, stringstream
कक्षा नहीं है, तो क्या कोई मुझे बता सकता है कि सी # प्रोग्राम से ऐसे फ़ंक्शन को कैसे कॉल करें?मैं सी ++ डीएलएल के फ़ंक्शन को कैसे कॉल कर सकता हूं जो सी # से स्ट्रिंगस्ट्रीम प्रकार के पैरामीटर को स्वीकार करता है?
उत्तर
यदि आप सी ++ डीएल संशोधित कर सकते हैं, तो एक सादा स्ट्रिंग संस्करण निर्यात करें। अन्यथा आपको एक प्रबंधित सी ++ रैपर प्रोजेक्ट बनाना है, अन्य सी ++ डीएल आयात करें, इसे एक प्रबंधित फ़ंक्शन के रूप में निर्यात करें, और इसे अपने सी # कोड से कॉल करें। सी ++ इंटरऑप वास्तव में बेकार है।
मुझे डर है कि आपको उस डीएलएल से निर्यात किए गए कार्यों का उपभोग करने में सक्षम होने के लिए सी # में अपना खुद का StringStream
कक्षा बनाना होगा। जैसा कि आपने बताया है, .NET Framework बॉक्स के बाहर कोई भी समान श्रेणी प्रदान नहीं करता है।
संभवतः .NET Framework द्वारा प्रदान की गई StringBuilder
कक्षा को लपेटने का सबसे आसान तरीका यह है कि यह स्ट्रीम के रूप में कार्य कर सकता है। आगे स्पष्टीकरण और कुछ नमूना कोड के लिए this blog post देखें।
एमएसडीएन पत्रिका में एक समान प्रश्न का भी उत्तर दिया गया: http://msdn.microsoft.com/en-us/magazine/cc163768.aspx। आपको उपयोगी संकेत दिए गए कुछ संकेत और/या नमूना कोड मिल सकते हैं।
आपको डीएलएल, अवधि के माध्यम से टेम्पलेटेड ऑब्जेक्ट्स का पर्दाफाश नहीं करना चाहिए।
टेम्पलेटेड ऑब्जेक्ट्स (उदाहरण के लिए std::
में लगभग सब कुछ) रेखांकित हो गया है। तो इस तरह, आपके डीएलएल को कार्यान्वयन की अपनी निजी प्रति प्राप्त होती है। आपके डीएलएल को कॉल करने वाले मॉड्यूल को stringstream
का अपना निजी कार्यान्वयन भी मिलेगा। उनके बीच गुजरने का मतलब है कि आप अनजाने में दो असंबद्ध कार्यान्वयन को बुनाई कर रहे हैं। कई परियोजनाओं के लिए, यदि आप सटीक समान बिल्ड सेटिंग्स का उपयोग कर रहे हैं, तो शायद यह कोई समस्या नहीं है।
लेकिन यदि आप एक ही कंपाइलर का उपयोग करते हैं, और डीबग EXE के साथ एक रिलीज डीएलएल मिश्रण करते हैं, तो आपको स्टैक/ढेर भ्रष्टाचार और अन्य कठिन खोजने वाली समस्याएं मिलेंगी।
और यह केवल आपके डीएलएल का उपयोग किसी अन्य अप्रबंधित सी ++ exe/dll से कर रहा है। तब क्रॉसिंग करना .NET की रेखाएं एक समस्या से भी अधिक है।
समाधान आपके डीएलएल के इंटरफ़ेस को डीएलएल सीमाओं के अनुकूल मित्रता में बदलने के लिए है। या तो COM (उदाहरण के लिए आप IStream
का उपयोग कर सकते हैं), या केवल एक सी-शैली इंटरफ़ेस Winapi की तरह।
आप सी # में प्रबंधित कोड में देशी सी ++ कोड को बांधने की कोशिश कर रहे हैं। सामान्य रूप से ऐसा करने का सबसे अच्छा तरीका प्रबंधित सी ++ में मध्यम परत पेश करना है जो सी # से कॉल के लिए इंटरफ़ेस प्रदान करेगा।
सी में एक रैपर डीएल बनाएं, या सी ++ जो उस फ़ंक्शन पर एक दोस्ताना कॉल का खुलासा करता है। यह बेहतर तरीका है। सी # कार्यक्रम में पैरामीटर के रूप में स्ट्रिंग और मिल गया निम्नलिखित रनटाइम त्रुटि: "बिना क्रिया के अपवाद: System.AccessViolationException:
उदाहरण के लिएएक
BOOL getString(TCHAR * myreturnString, DWORD *size);
- 1. मैं ओवरलोडेड .NET फ़ंक्शन को कैसे कॉल कर सकता हूं जो पावरहेल से सी # आउट तर्क का उपयोग करता है?
- 2. मैं सी # में एसक्यूएल फ़ंक्शन कैसे कॉल कर सकता हूं?
- 3. कोई फ़ंक्शन कैसे लिखें जो फ़ंक्शन को कॉल करता है जो डेटा.table को कॉल करता है?
- 4. Win32 फ़ंक्शन को कॉल करने के लिए मैं एक सामान्य सी फ़ंक्शन कैसे लिख सकता हूं?
- 5. डीएलएल से कॉल फ़ंक्शन?
- 6. मैं सर्वरस्केट स्वीकार() विधि को कैसे बाधित कर सकता हूं?
- 7. सी ++ निर्माता कॉल पैरामीटर प्रकार
- 8. मैं एक फ़ंक्शन को कैसे कॉल कर सकता हूं जो Tuple2 के साथ 2 पैरामीटर लेता है?
- 9. मैं बिना किसी फ़ंक्शन के पैरामीटर को पैरामीटर कैसे पास कर सकता हूं?
- 10. सी ++ फ़ंक्शन कंक्रीट कार्यान्वयन स्वीकार नहीं करता
- 11. सी ++ डीएलएल को सी # प्रोजेक्ट
- 12. सी ++ 11 फ़ंक्शन जो केवल स्ट्रिंग अक्षरों को स्वीकार करता है?
- 13. क्या मेरे पास सी मैक्रो हो सकता है जो पैरामीटर की अपरिभाषित संख्या स्वीकार करता है?
- 14. सी #: कैसे - एकल उदाहरण अनुप्रयोग जो नए मानकों को स्वीकार करता है?
- 15. मैं एक फ़ंक्शन कैसे बना सकता हूं जो पाइपलाइन और कमांड लाइन से एकाधिक तर्क प्रकार स्वीकार करता है?
- 16. सी ++ परिवर्तनीय पैरामीटर के साथ कॉल लुआ फ़ंक्शन
- 17. मैं सी #+/सीएलआई को सी # से कैसे कॉल करूं?
- 18. PHP स्ट्रेटोटाइम() फ़ंक्शन जो प्रारूप को स्वीकार करता है?
- 19. क्या होता है यदि मैं जेएनआई के साथ सी से एकाधिक धागे से जावा फ़ंक्शन को कॉल करता हूं?
- 20. मैं विशिष्ट पैरामीटर को सी # में अप्रचलित/बहिष्कृत के रूप में कैसे चिह्नित कर सकता हूं?
- 21. मैं एक jquery फ़ंक्शन कैसे लिखूं जो कॉलबैक को पैरामीटर
- 22. आप सी ++ से प्रबंधित (सी #) फ़ंक्शन कैसे कॉल करते हैं?
- 23. मैं क्लोजर प्रकार को परिभाषित कैसे कर सकता हूं जो सर्वलेट इंटरफ़ेस लागू करता है?
- 24. मैं एक फ़ंक्शन टाइप कैसे कर सकता हूं जो एक ही प्रकार के दूसरे फ़ंक्शन को लौटाता है?
- 25. मैं कैसे मोनो टच के साथ जावास्क्रिप्ट फ़ंक्शन को कॉल कर सकता हूं और इसके विपरीत?
- 26. क्या मैं एक सी ++ फंक्शन लिख सकता हूं जो कच्चे सूचक और स्मार्ट पॉइंटर दोनों को स्वीकार करता है?
- 27. सी में फ़ंक्शन पॉइंटर के माध्यम से एक स्थैतिक फ़ंक्शन को कॉल किया जा सकता है?
- 28. एक सी # जेनेरिक विधि बना रहा है जो (शून्य) मान प्रकार और संदर्भ प्रकार को स्वीकार करता है?
- 29. क्या होता है जब मैं जावास्क्रिप्ट फ़ंक्शन को कॉल करता हूं जो पैरामीटर की आपूर्ति किए बिना पैरामीटर लेता है?
- 30. विंडोज सी ++: मैं fprintf पर कॉल के लिए stderr को कैसे रीडायरेक्ट कर सकता हूं?
मैं अप्रबंधित सी ++ कि लेता एसटीडी में एक समारोह को आयात करने की कोशिश की करने का प्रयास किया संरक्षित स्मृति को पढ़ें या लिखें। यह अक्सर एक संकेत है कि अन्य स्मृति दूषित है। Win32API.processRequestWithStream (स्ट्रिंग और इनपुटस्ट्रिंग, स्ट्रिंग और आउटपुटस्ट्रिंग) पर Win32API.Main() "- इस त्रुटि का कारण क्या हो सकता है? – user186246
'std :: string'' std :: basic_string ', यानी' का टाइप किया गया है, यह 'स्ट्रिंगस्ट्रीम' के रूप में बस टेम्पलेट है। –
और विभिन्न स्मार्ट पॉइंटर्स के बारे में क्या?यदि मैं इसे सचमुच लेता हूं, तो इसका मतलब है कि किसी को डीएलएल सीमाओं में गैर-तुच्छ सी ++ का पर्दाफाश नहीं करना चाहिए। –