2008-10-02 27 views
18

एक DLL में निम्नलिखित सी समारोह को देखते हुए में:मार्शल "चार *" सी #

char * GetDir(char* path); 

तुम कैसे पी/सी # में इस समारोह आह्वान और चार मार्शल * ठीक से होगा। .NET को पता है कि एलपीसीटीस्ट्रेट कैसे करना है, लेकिन जब मैं किसी भी मार्शलिंग को नहीं समझ सकता जो इस फ़ंक्शन को कॉल करते समय NotSupportedException को आग लगने का कारण नहीं बनाता है।

उत्तर

21

ओरेगॉनहोस्ट का जवाब केवल तभी सही है जब गेटडिर से लौटा गया चार या तो एचजीएलओबल या लोकलएलोक में आवंटित किया गया हो। मुझे याद नहीं है कि कौन सी सीएलआर मान लेगी कि पीएनवोक फ़ंक्शन से किसी भी स्ट्रिंग रिटर्न प्रकार को एक या दूसरे के साथ आवंटित किया गया था।

गेटडियर की वापसी IntPtr होने की वापसी का एक और मजबूत तरीका है। फिर आप एक स्ट्रिंग प्रकार प्राप्त करने के लिए किसी भी मार्शल.PtrToStringAnsi फ़ंक्शंस का उपयोग कर सकते हैं। यह आपको अपनी पसंद के तरीके में स्ट्रिंग को मुक्त करने की वांछितता भी देता है।


[DllImport("your.dll", CharSet = CharSet.Ansi)] 
IntPtr GetDir(StringBuilder path); 

क्या आप हमें गेटडियर के व्यवहार के रूप में कोई अन्य संकेत दे सकते हैं? क्या यह इनपुट स्ट्रिंग को संशोधित करता है? आवंटित मूल्य कैसे आवंटित किया जाता है? यदि आप प्रदान कर सकते हैं कि मैं एक बेहतर जवाब दे सकता हूं।

+0

अह्ह्ह .... PtrToStringAnsi वह था जो मैं खोज रहा था, मुझे इस दौरान IntPtr का उपयोग करने के लिए पता चला था, लेकिन अब मैं एक स्नैग में चला गया ... मैं .NETCF और PtrToStringAnsi का उपयोग कर रहा हूं केवल पूर्ण ढांचे में :( –

+0

यह पता चला है कि OpenNetCF में PtrToStringAnsi है .... समस्या हल हो गई है। जैसे ही मैं कोड का परीक्षण कर सकता हूं, इसे स्वीकार कर लिया जाएगा। –

+0

क्या .NET स्वचालित रूप से इनपुट पैरामीटर के लिए स्ट्रिंगबिल्डर को char * पर मार्शल करने के लिए जानता है या था काम करने के लिए कुछ तीसरे पक्ष पुस्तकालय की आवश्यकता है? धन्यवाद। – kmehta

12

[DllImport("your.dll", CharSet = CharSet.Ansi)] 
string GetDir(StringBuilder path); 

स्ट्रिंग स्वचालित रूप से एक शून्य समाप्त स्ट्रिंग के लिए मार्शल है की कोशिश करो, और CharSet संपत्ति के साथ, आप Marshaller बताते हैं कि यह एएनएसआई के बजाय यूनिकोड का उपयोग करना चाहिए। नोट: एक कॉन्स char * के लिए स्ट्रिंग (या System.String) का उपयोग करें, लेकिन char * के लिए स्ट्रिंगबिल्डर।

आप this example में मार्शलए को भी आजमा सकते हैं।

+2

क्या आप किसी भी कारण से जानते हैं कि 'string ansi = Marshal.PtrToStringAnsi (ptr);' सफल होगा, लेकिन 'CharSet = CharSet.Ansi' के साथ 'स्ट्रिंग' को वापस करने में असफल रहेगा? – jocull

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