मैं कोड के साथ इंटरफ़ेस रहा हूँ कि लेता है एक char**
(अर्थात, एक स्ट्रिंग के लिए सूचक है) मार्शलिंग:सी # में एक चार **
int DoSomething(Whatever* handle, char** error);
असल में, वह अपने राज्य के लिए एक संभाल लेता है, और अगर कुछ गलत हो जाता है, यह एक त्रुटि कोड देता है और वैकल्पिक रूप से एक त्रुटि संदेश (स्मृति को बाहरी रूप से आवंटित किया जाता है और दूसरे फ़ंक्शन के साथ मुक्त किया जाता है। वह भाग मैंने पाया है :))।
हालांकि, मुझे यकीन नहीं है कि सी # में कैसे संभालना है। क्या मैं वर्तमान में है:
[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
private static unsafe extern int DoSomething(IntPtr handle, byte** error);
public static unsafe int DoSomething(IntPtr handle, out string error) {
byte* buff;
int ret = DoSomething(handle, &buff);
if(buff != 0) {
// ???
} else {
error = "";
}
return ret;
}
मैं चारों ओर poked है, लेकिन मुझे लगता है कि सही रास्ते पर UTF8Encoding.UTF8.GetString()
एम आई को खिलाने के लिए चालू करने के लिए कैसे एक byte[]
में, उपयुक्त को समझ नहीं सकता?
संपादित करें: अधिक स्पष्ट करने के लिए, पुस्तकालय समारोह स्मृति, जो बुला एक और पुस्तकालय समारोह द्वारा मुक्त किया जाना चाहिए आवंटित करता है। यदि कोई समाधान मुझे पॉइंटर के साथ नहीं छोड़ता है तो मैं मुक्त कर सकता हूं, समाधान अस्वीकार्य है।
बोनस प्रश्न: जैसा कि ऊपर बताया गया है, यह पुस्तकालय अपने तारों के लिए यूटीएफ -8 का उपयोग करता है। क्या मुझे अपने पी/इनवॉक्स में कुछ भी विशेष करने की ज़रूरत है, या सामान्य const char*
पैरामीटर के लिए बस string
का उपयोग करें?
क्या आपने स्ट्रिंगबिल्डर 'को बाहर करने की कोशिश की है? – leppie
मैंने रूट समस्या को स्पष्ट करने के लिए एक अतिरिक्त संपादन जोड़ा है। –