पी / चालान और .NET लक्ष्य रूपरेखा [डुप्लिकेट]

Jan 22 2021

यह मुद्दा मुझे दीवार पर चढ़ा रहा है ... बस कह रहा हूं।

मेरी कंपनी की विरासत C ++ लाइब्रेरी है और मुझे .NET रैपर बनाने का काम सौंपा गया है।
मेरे पास C ++ या P / Invoke का कोई अनुभव नहीं है, इसलिए इसे शुरू करने के लिए मैं एक सरल विधि की कोशिश कर रहा हूं।

मैंने आधिकारिक दस्तावेज़ीकरण पढ़ा है और मुझे एक अच्छा ट्यूटोरियल भी मिला है ।
हालाँकि, मुझे पता चला है कि उपभोग करने वाले ऐप के लक्ष्य .NET फ्रेमवर्क में फर्क पड़ता है।
ट्यूटोरियल से P / Invoke कोड ठीक काम करता है लेकिन मैंने देखा है कि वह .NET फ्रेमवर्क 4 क्लाइंट प्रोफाइल को लक्षित कर रहा है ।
अगर मैं ब्रेक पॉइंट लगाता हूं तो वे हिट हो जाते हैं और सब कुछ उम्मीद के मुताबिक काम करता है, अगर मैं किसी फ्रेमवर्क को 4 से ज्यादा का टारगेट करता हूं तो प्रोग्राम बिना किसी अपवाद के क्रैश हो जाता है।

मेरे पास C ++ में एक बहुत ही सरल विधि है:
framework.h

extern "C" {
    API char* SayHello();
}

dllmain.cpp

char* SayHello() {
    return (char*)"Hello";
}

C#

        [DllImport("PInvokeTest.dll")]
        public static extern string SayHello();

(मैंने विभिन्न संयोजनों में विशेषता पर कॉलिंग कन्वेंशन और चारसेट स्थापित करने की कोशिश की है, मैं चीनी वर्ण प्राप्त करने में कामयाब रहा हूं, लेकिन फ्रेमवर्क 4 से अधिक काम नहीं कर रहा हूं)

मेरी C ++ परियोजना में API=__declspec(dllexport)प्रीप्रोसेसर परिभाषाएँ हैं और कॉलिंग कन्वेंशन है _stdcall (\Gz)(मैंने _cdecl भी आज़माया है)। फ्रेमवर्क 4
पर C # प्रोजेक्ट ठीक काम करता है , जब मैं ऊपर की किसी भी चीज़ को बदलता हूं तो यह बिना किसी अपवाद के निकल जाता है। मैं भी निर्भरता जीयूआई है कि मुझे दिखा रहा है कि वास्तव में वहाँ है पाया है।
SayHello

हमारी कंपनी 4.6.1 का उपयोग करती है, मुझे इस लेख के बारे में भी पता चला जो मुझे PInvokeStackImbalance की ओर ले जाता है, लेकिन यह मेरे मामले में कुछ भी नहीं करता है।

किसी भी तरह की सहायता का स्वागत किया जाएगा।
यदि आवश्यक हो तो मैं एक अस्थायी GitHub रेपो बना सकता है।

जवाब

LukeTO'Brien Jan 22 2021 at 19:50

अब जब मुझे पता है कि यह एक स्ट्रिंग मुद्दा है जिसे मैंने थोड़ा खोज किया था और मुझे यह SO प्रश्न मिला ।
इसलिए अंत में मैंने BSTRदृष्टिकोण का उपयोग किया ।

BSTR SayHello() {
    return ::SysAllocString(L"Hello");
}
        [DllImport("DBReplicator.Lib.dll")]
        [return: MarshalAs(UnmanagedType.BStr)]
        public static extern string SayHello();

... फिर भी पता नहीं कैसे मैं चीनी पात्रों को पाने में कामयाब रहा।