मैं एक देशी DLL में निम्नलिखित समारोह हेडर रख:मार्शल एक अहस्ताक्षरित चार * एक dll से समारोह लौटने, सी # में
unsigned char* Version_String()
मैं इसे एक सी # परियोजना से कॉल करने के लिए कोशिश कर रहा हूँ, मैं कोशिश की है निम्नलिखित कॉल (के रूप में यहां अन्य इसी तरह के सवाल पर पाया):
[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
public extern static UIntPtr Version_String();
और मैं निम्न अपवाद बार आ रही है:
का प्रयास किया गया पढ़ने के लिए या prot लिखने के लिए ected स्मृति। यह अक्सर एक संकेत है कि अन्य स्मृति भ्रष्ट है।
अगले कोशिश निम्नलिखित था और मैं एक ही अपवाद:
[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
[return : MarshalAs(UnmanagedType.LPStr)]
public extern static string Version_String();
मैं इस समस्या के समाधान पाने के लिए नहीं कर पा रहे। किसी भी तरह की सहायता का स्वागत किया जाएगा!
संपादित करें: इस तरह
मैं DLL कोड यहाँ के रूप में यह एक एनडीए के अंतर्गत आता है नहीं दे सकता है, लेकिन समारोह मैं फोन कर रहा हूँ लगता:
unsigned char versionString[50];
__declspec(dllexport) unsigned char* Version_String()
{
if(check_hardware_stuff())
{
strcpy((char *) versionString, "version_string_bla_bla");
versionString[5] = stuff;
}
else if (other_check())
{
//will return empty string, that should be filled with '\0'
}
else
{
strcpy((char *) versionString, "ERROR");
}
return versionString;
}
मैं विशेष रूप से डीएलएल कार्यान्वयन का शौक नहीं है, लेकिन मुझे इसे "जैसा है" का उपयोग करने की आवश्यकता है। जब भी मैं वापसी मूल्य के साथ क्या करता हूं, भले ही मैं VersionString()
पर कॉल करने का प्रयास करता हूं, तो मुझे अपवाद फेंक दिया जाता है।
शायद आप गलत [कॉलिंग कन्वेंशन] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx) का उपयोग कर रहे हैं? – svick
क्या आपका डीएल मल्टीबाइट वर्णसेट विकल्प के साथ संकलित किया गया था? –
देशी कोड क्रैश होने का पता लगाने के लिए डीबगर का उपयोग करें। प्रोजेक्ट + गुण, डीबग, "अप्रबंधित कोड डीबगिंग सक्षम करें" पर टिकटें। सी स्रोत कोड फ़ाइल में फ़ंक्शन पर ब्रेकपॉइंट सेट करें। –