2011-03-20 8 views
6

मैं एक देशी सी ++ बनाना चाहता हूं जो कि सी # प्रोजेक्ट से उपयोग किया जा सकता है।सी # देशी सी ++ कॉलिंग सभी कार्यों: किस प्रकार का उपयोग करना है?

  • यदि मैं सी ++ में फ़ंक्शन में सी # से स्ट्रिंग पास करना चाहता हूं, तो मुझे किस पैरामीटर का उपयोग करना चाहिए?
  • मुझे पता है कि सी # तार यूनिकोड का उपयोग करते हैं, इसलिए मैंने फ़ंक्शन के लिए wchar_t * की कोशिश की लेकिन यह काम नहीं किया; मैंने बुलाए गए कार्यों से उठाए गए अपवादों को पकड़ने की कोशिश की, लेकिन कोई अपवाद नहीं फेंक दिया गया।
  • मैं भी एक स्ट्रिंग वापस करना चाहता हूं ताकि मैं इसका परीक्षण कर सकूं।

सी ++ समारोह है निम्नलिखित:

DECLDIR wchar_t * setText(wchar_t * allText) { 
    return allText; 
} 

सी # कोड निम्नलिखित है:

[DllImport("firstDLL.Dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]  
public static extern string setText(string allText); 

var allText= new string('c',4); 
try { 
    var str1 = setText(allText); 
} 
catch (Exception ex) { 
    var str2 = ex.Message; 
} 

मुझे किस प्रकार के सी ++ फ़ंक्शन द्वारा दिया गया प्रकार के लिए उपयोग करना चाहिए, ताकि मैं string[] के रिटर्न प्रकार के साथ इसे सी # से कॉल करें? एक ही क्यू लेकिन फंक्शन के पैरामीटर के लिए स्ट्रिंग [] में सी #?

+1

वैसे, इस तरह के var का उपयोग जल्द ही आपको काटने के लिए वापस आ जाएगा जब आपको लगता है कि आपको पता नहीं है कि आपके किसी भी प्रकार का चर क्या है। –

+0

जैसे ही आप इन 3 var (ओं) संकलित हो जाते हैं। – ukhardy

+2

@ukhardy ओह चलो, मुझे पता है कि! मुद्दा यह है कि जब आपके पास अपने कोड पर भिन्न बिखरा हुआ है, और यह इससे अधिक जटिल है, तो आप पाते हैं कि यह मौजूदा कोड को समझने में बाधा बन गया है। –

उत्तर

3

मैं शायद इसे COM BSTR के साथ करूँगा और बफर आवंटन के साथ गड़बड़ करने से बचें। कुछ इस तरह:

सी ++

#include <comutil.h> 
DECLDIR BSTR * setText(wchar_t * allText) 
{ 
    return ::SysAllocString(allText); 
} 

सी #

[DllImport(@"firstDLL.dll", CallingConvention = CallingConvention.Cdecl)] 
[return: MarshalAs(UnmanagedType.BStr)] 
private static extern string setText(string allText); 

BSTR मूल COM स्ट्रिंग प्रकार है। इसका उपयोग करने का लाभ यह है कि स्मृति आवंटक के साथ इंटरफ़ेस (सी ++ में) के मूल पक्ष पर स्मृति आवंटित की जा सकती है, और फिर उसी आवंटक के साथ इंटरफ़ेस के प्रबंधित पक्ष पर नष्ट हो जाती है। पी/Invoc marshaller BSTR के बारे में सभी जानता है और आपके लिए सब कुछ संभालता है।

जबकि आप बफर की लंबाई के चारों ओर गुजरकर इस समस्या को हल कर सकते हैं, तो इसके परिणामस्वरूप गन्दा कोड होता है, यही कारण है कि मुझे BSTR के लिए प्राथमिकता है।


अपने दूसरे प्रश्न के लिए, पी के बारे में/string[] लागू, मुझे लगता है कि आप मिल जाएगा कि तुम क्या Chris Taylor's answer से एक और सवाल स्टैक ओवरफ़्लो पर यहाँ की जरूरत है।

+0

मुझे वास्तव में किसी भी चार को माइक्रोसॉफ्ट शब्द को पकड़ने में सक्षम होना चाहिए इसका उपयोग कर सकते हैं क्यू है: क्या बीएसटी यूनिकोड चार पकड़ सकता है? – ghet

+0

@ghet BSTR केवल यूनिकोड char रखता है! यह मेरी राय में आपकी आवश्यकताओं के लिए एकदम सही है। –

+0

दूसरे क्यू के लिए: रिटर्न प्रकार के लिए सी ++ में क्या उपयोग करना है ताकि मेरे पास स्ट्रिंग [] रिटर्न टाइप सी # में हो, तो क्या आप इसके साथ मदद कर सकते हैं? – ghet

0

सी ++

void GetString(char* buffer, int* bufferSize); 

सी #

int bufferSize = 512; 
StringBuilder buffer = new StringBuilder(bufferSize); 
GetString(buffer, ref bufferSize) 
+1

यह एक आंशिक उत्तर है जो कार्यान्वयन के बिना बहुत मदद नहीं करता है। –

+0

पी/Invoc marshaller शून्य शून्य समाप्त तारों के लिए स्पष्ट समर्थन है। क्रियान्वयन? – ukhardy

+0

यह सच है लेकिन समस्या यह है कि सामग्री एक विदेशी स्मृति आवंटक से आती है! –

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