2010-12-27 9 views
8

मैं एक अप्रबंधित सी ++ डीएलएल आयात करना चाहता हूं और एक पैरामीटर के रूप में stringstream लेता हूं। सी # में, stringstream कक्षा नहीं है, तो क्या कोई मुझे बता सकता है कि सी # प्रोग्राम से ऐसे फ़ंक्शन को कैसे कॉल करें?मैं सी ++ डीएलएल के फ़ंक्शन को कैसे कॉल कर सकता हूं जो सी # से स्ट्रिंगस्ट्रीम प्रकार के पैरामीटर को स्वीकार करता है?

उत्तर

3

यदि आप सी ++ डीएल संशोधित कर सकते हैं, तो एक सादा स्ट्रिंग संस्करण निर्यात करें। अन्यथा आपको एक प्रबंधित सी ++ रैपर प्रोजेक्ट बनाना है, अन्य सी ++ डीएल आयात करें, इसे एक प्रबंधित फ़ंक्शन के रूप में निर्यात करें, और इसे अपने सी # कोड से कॉल करें। सी ++ इंटरऑप वास्तव में बेकार है।

3

मुझे डर है कि आपको उस डीएलएल से निर्यात किए गए कार्यों का उपभोग करने में सक्षम होने के लिए सी # में अपना खुद का StringStream कक्षा बनाना होगा। जैसा कि आपने बताया है, .NET Framework बॉक्स के बाहर कोई भी समान श्रेणी प्रदान नहीं करता है।

संभवतः .NET Framework द्वारा प्रदान की गई StringBuilder कक्षा को लपेटने का सबसे आसान तरीका यह है कि यह स्ट्रीम के रूप में कार्य कर सकता है। आगे स्पष्टीकरण और कुछ नमूना कोड के लिए this blog post देखें।

एमएसडीएन पत्रिका में एक समान प्रश्न का भी उत्तर दिया गया: http://msdn.microsoft.com/en-us/magazine/cc163768.aspx। आपको उपयोगी संकेत दिए गए कुछ संकेत और/या नमूना कोड मिल सकते हैं।

11

आपको डीएलएल, अवधि के माध्यम से टेम्पलेटेड ऑब्जेक्ट्स का पर्दाफाश नहीं करना चाहिए।

टेम्पलेटेड ऑब्जेक्ट्स (उदाहरण के लिए std:: में लगभग सब कुछ) रेखांकित हो गया है। तो इस तरह, आपके डीएलएल को कार्यान्वयन की अपनी निजी प्रति प्राप्त होती है। आपके डीएलएल को कॉल करने वाले मॉड्यूल को stringstream का अपना निजी कार्यान्वयन भी मिलेगा। उनके बीच गुजरने का मतलब है कि आप अनजाने में दो असंबद्ध कार्यान्वयन को बुनाई कर रहे हैं। कई परियोजनाओं के लिए, यदि आप सटीक समान बिल्ड सेटिंग्स का उपयोग कर रहे हैं, तो शायद यह कोई समस्या नहीं है।

लेकिन यदि आप एक ही कंपाइलर का उपयोग करते हैं, और डीबग EXE के साथ एक रिलीज डीएलएल मिश्रण करते हैं, तो आपको स्टैक/ढेर भ्रष्टाचार और अन्य कठिन खोजने वाली समस्याएं मिलेंगी।

और यह केवल आपके डीएलएल का उपयोग किसी अन्य अप्रबंधित सी ++ exe/dll से कर रहा है। तब क्रॉसिंग करना .NET की रेखाएं एक समस्या से भी अधिक है।

समाधान आपके डीएलएल के इंटरफ़ेस को डीएलएल सीमाओं के अनुकूल मित्रता में बदलने के लिए है। या तो COM (उदाहरण के लिए आप IStream का उपयोग कर सकते हैं), या केवल एक सी-शैली इंटरफ़ेस Winapi की तरह।

+0

मैं अप्रबंधित सी ++ कि लेता एसटीडी में एक समारोह को आयात करने की कोशिश की करने का प्रयास किया संरक्षित स्मृति को पढ़ें या लिखें। यह अक्सर एक संकेत है कि अन्य स्मृति दूषित है। Win32API.processRequestWithStream (स्ट्रिंग और इनपुटस्ट्रिंग, स्ट्रिंग और आउटपुटस्ट्रिंग) पर Win32API.Main() "- इस त्रुटि का कारण क्या हो सकता है? – user186246

+1

'std :: string'' std :: basic_string ', यानी' का टाइप किया गया है, यह 'स्ट्रिंगस्ट्रीम' के रूप में बस टेम्पलेट है। –

+1

और विभिन्न स्मार्ट पॉइंटर्स के बारे में क्या?यदि मैं इसे सचमुच लेता हूं, तो इसका मतलब है कि किसी को डीएलएल सीमाओं में गैर-तुच्छ सी ++ का पर्दाफाश नहीं करना चाहिए। –

0

आप सी # में प्रबंधित कोड में देशी सी ++ कोड को बांधने की कोशिश कर रहे हैं। सामान्य रूप से ऐसा करने का सबसे अच्छा तरीका प्रबंधित सी ++ में मध्यम परत पेश करना है जो सी # से कॉल के लिए इंटरफ़ेस प्रदान करेगा।

0

सी में एक रैपर डीएल बनाएं, या सी ++ जो उस फ़ंक्शन पर एक दोस्ताना कॉल का खुलासा करता है। यह बेहतर तरीका है। सी # कार्यक्रम में पैरामीटर के रूप में स्ट्रिंग और मिल गया निम्नलिखित रनटाइम त्रुटि: "बिना क्रिया के अपवाद: System.AccessViolationException:

उदाहरण के लिए

एक

BOOL getString(TCHAR * myreturnString, DWORD *size); 
संबंधित मुद्दे

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