दिलचस्प पोस्ट
पायथन में समीकरण पार्सिंग java समय प्रारूप में मिलीसेकंड को परिवर्तित करता है छवि एपीआई द्वारा Google खोज? पता लगाएँ कि क्या वर्तमान समय एक समय सीमा में आता है java.util.zip.ZipException: पैकेज के दौरान डुप्लिकेट प्रविष्टिसभी डीबग क्लासेसफोरमल्टीडीक्स UIImagePickerController में सेना के लैंडस्केप अभिविन्यास जेपीए ने एक @ जनरेटेड वैल्यू @ आईडी को कब सेट किया समझना। LINQ से एसक्यूएल में एएनएनमेरेबल () स्कला की छुपी हुई विशेषताओं Async का उपयोग / कई कार्यों के लिए इंतजार ओपनसीवी में स्मृति में बड़ी मात्रा में कुशलतापूर्वक लोड करें क्या HTML5 को ड्रैग-ड्रॉप फ़ोल्डर्स या फ़ोल्डर ट्री का अपलोड करना है? C ++ कोड में कौन सी सीआई / ओ लाइब्रेरी का उपयोग किया जाना चाहिए? एंड्रॉइड कैमरा ओरिएंटेशन को ठीक से कैसे सेट करें? Django में डायनामिक फ़ाइल पथ

std :: स्ट्रिंग सी # में है?

मैंने सोचा था कि समस्या मेरे सी ++ फ़ंक्शन के अंदर है, लेकिन मैंने यह कोशिश की

सी ++ डेल में सी ++ फ़ंक्शन:

bool __declspec( dllexport ) OpenA(std::string file) { return true; } 

सी # कोड:

 [DllImport("pk2.dll")] public static extern bool OpenA(string path); if (OpenA(@"E:\asdasd\")) 

मुझे एक अपवाद मिलता है कि स्मृति भ्रष्ट है, क्यों?

यदि मैं std :: string पैरामीटर को निकालता हूं, यह महान काम करता है, लेकिन std :: स्ट्रिंग के साथ यह काम नहीं करता।

वेब के समाधान से एकत्रित समाधान "std :: स्ट्रिंग सी # में है?"

std :: string और c # स्ट्रिंग एक दूसरे के साथ संगत नहीं हैं जहाँ तक मुझे पता है कि c # स्ट्रिंग को पास char* या wchar_t* c ++ में पारित करने के लिए मेल खाती है, जहां तक ​​अंतर का संबंध है
इसका एक कारण यह है कि std :: string और c # के कई अलग-अलग कार्यान्वयन हो सकते हैं यह मान नहीं सकते हैं कि आप किसी विशेष का उपयोग कर रहे हैं।

इस तरह से कुछ प्रयास करें:

 bool __declspec( dllexport ) OpenA(const TCHAR* pFile) { std::string filename(pFile); ... return true; } 

आपको अपने DllImport विशेषता में उपयुक्त वर्ण सेट (यूनिकोड / एएनएसआई) भी निर्दिष्ट करना चाहिए।

आपकी मार्शलिंग समस्या से संबंधित एक अलग, एक सामान्य रूप से, एक सामान्य रूप से एक स्टड स्ट्रिंग को एक कॉन्फेंट संदर्भ: const std: string & filename के रूप में पास किया जाएगा।

जिस तरह से आप प्रयास कर रहे हैं, उसमें सी ++ std :: स्ट्रिंग मार्शल करना संभव नहीं है। आपको वास्तव में यहां क्या करने की ज़रूरत है एक आवरण समारोह लिखें जो एक सादे पुरानी const char* का उपयोग करता है const char* और स्टड :: स्ट्रिंग को हुड के तहत परिवर्तित करता है।

सी ++

 extern C { void OpenWrapper(const WCHAR* pName) { std::string name = pName; OpenA(name); } } 

सी#

 [DllImport("pk2.dll")] public static extern void OpenWrapper( [In] string name); 

मुझे पता है कि यह विषय एक बालक है, लेकिन भविष्य के googlers के लिए, यह भी काम करना चाहिए (सी * का उपयोग किए बिना सी ++)

सी#:

 public static extern bool OpenA([In, MarshalAs(UnmanagedType.LPStr)] path); 

सी ++:

 bool __declspec( dllexport ) OpenA(std::string file);