मुझे एक सी # प्रोग्राम मिला है जिसे एक अप्रबंधित फ़ंक्शन में चार बफर पास करने की आवश्यकता है। मुझे दो तरीकों से मिल गया है जो विश्वसनीय रूप से काम करने लगते हैं, लेकिन मुझे यकीन नहीं है कि मुझे कौन सा चयन करना चाहिए।सी # से अप्रबंधित फ़ंक्शन को कॉल करना: क्या मुझे स्ट्रिंगबिल्डर पास करना चाहिए या असुरक्षित कोड का उपयोग करना चाहिए?
यहां अप्रबंधित फ़ंक्शन के हस्ताक्षर हैं।
extern "C" __declspec(dllexport) int getNextResponse(char *buffer);
पहला विकल्प बफर को स्ट्रिंगबिल्डर के रूप में परिभाषित करना है, जैसा कि निम्नानुसार है।
//at class level...
[DllImport("mydll.dll")]
static extern int getNextResponse(StringBuilder buffer);
//in main method body...
StringBuilder sb = new StringBuilder(" ", 65536);
int rc = getNextResponse(sb);
यह सरल है, और यह काम करता है, और मुझे लगता है कि मैं मूल रूप से समझ में क्यों काम करता है क्योंकि StringBuilder पर्दे के पीछे एक बफर है, तो (मुझे लगता है) इंटरॉप परत सिर्फ एक चार को StringBuilder वास्ते है *।
दूसरा विकल्प असुरक्षित कोड का उपयोग कर रहा है।
//at class level...
[DllImport("mydll.dll")]
static extern int getNextResponse(byte* buffer);
//separate method...
private static unsafe int runGetNextResponse(byte[] buffer)
{
fixed (byte* p = buffer)
{
int rc = getNextResponse(p);
return rc;
}
}
//in main method body...
byte[] b = new byte[65536];
int rc = runGetNextResponse(b);
दूसरा दृष्टिकोण अधिक कोड है, लेकिन यह भी हो रहा है कि यह क्या हो रहा है इसके बारे में और भी स्पष्ट है।
क्या ये दो दृष्टिकोण मूल रूप से एक ही काम कर रहे हैं? क्या एक दूसरे को चुनने का कोई कारण है?
क्या होता है यदि कचरा कलेक्टर स्ट्रिंगबिल्डर को पुनः प्राप्त करता है तो getNextResponse निष्पादन के दौरान एक निश्चित कथन के बिना पारित किया जाता है? आयातित कार्यों में उपयोग किए गए प्रत्येक सूचक पैरामीटर को ठीक किया जाएगा? या मैं कुछ याद कर रहा हूँ? – Luca