2010-01-03 17 views
7

सी # PInvoke में, मैं एक स्ट्रिंग बफर कैसे पास करूं ताकि सी डीएलएल इसे भरता है और लौटाता है? PInvoke घोषणा क्या होगी?सी # स्ट्रिंग घोषणाओं के बाहर PInvoke

सी समारोह घोषणा

int GetData(char* data, int buflength); 

सी # में है, मैं इसे

के रूप में घोषित किया है
[DllImport(DllName)] 
static extern Int32 GetData([MarshalAs(UnmanagedType.LPStr)]StringBuilder receiveddata, Int32 buflen); 

यह सही है? मैं स्ट्रिंगबिल्डर परिवर्तक को इस

int bufferLength = 32; 
StringBuilder data = new StringBuilder(bufferLength); 
int result = GetData(data, bufferLength); 

मैं जानना चाहता हूं कि यह सही है या नहीं?

धन्यवाद

+0

यह अगर यह काम करता है सही है। इसका कोई स्पष्ट कारण नहीं है कि इसे काम नहीं करना चाहिए। –

उत्तर

7

मुझे विश्वास है कि यह सही है।

[DllImport(DllName)] 
static extern int GetData(StringBuilder data, int length); 

जो इस तरह कहा जाता है:

StringBuilder data = new StringBuilder(32); 
GetData(data, data.Capacity); 

मैं एक बार बाइट्स मेरी समारोह से लौट आए पर अधिक नियंत्रण है चाहता था और इस तरह से यह किया:

[DllImport(DllName)] 
private unsafe static bool GetData(byte* data, int length); 

इस तरह इस्तेमाल किया :

byte[] bytes = new byte[length]; 

fixed(byte* ptr = bytes) 
{ 
    bool success = Library.GetData(ptr, length); 

    if (!success) 
    Library.GetError(); 

    return Encoding.UTF8.GetString(bytes); 
} 
3

मैं करता हूं ऐसा नहीं लगता कि यहां मार्शलएस विशेषता का उपयोग करना आवश्यक है। स्ट्रिंगबिल्डर चार * आउट के लिए सही विकल्प है।

मुझे लगता है कि CharSet संपत्ति को जोड़ना अच्छा होगा क्योंकि आप यहां तारों से निपट रहे हैं।

इस तरह

:

[DllImport(DllName, CharSet=CharSet.Auto)]