2011-03-01 14 views
15

पर सी # प्रतिनिधि के कॉलिंग सम्मेलन को बदलना मुझे सी # के साथ यह समस्या आई है जब मैं डॉटनेट 1.1सीडीईसीएल

समस्या का उपयोग कर रहा था। मेरे पास एक अप्रबंधित डीएल है, जिसमें एक फ़ंक्शन है जो फ़ंक्शन पॉइंटर (अन्य तर्कों के बीच) लेता है। जब मैं सी # कोड में DLLImport घोषित करता हूं, तो मैं एक प्रतिनिधि को पास करता हूं। लेकिन सी # में प्रतिनिधियों के पास stdcall कॉलिंग सम्मेलन है जबकि अप्रबंधित कार्य cdecl फ़ंक्शन पॉइंटर की अपेक्षा करता है। इस प्रकार मेरे निष्पक्ष दृष्टिकोण के परिणामस्वरूप दुर्घटनाएं हुईं। फिर मुझे निम्नलिखित मिला: http://www.codeproject.com/KB/cs/cdeclcallback.aspx कुछ लोगों ने एक उत्कृष्ट पुस्तकालय लिखा जो प्रतिनिधि के बदलते कॉलिंग सम्मेलन को सक्षम करता है, जैसा कि मैंने समझा, एमएसआईएल-हैकिंग। चीजें अच्छी तरह से चली गईं, जब तक ...

मैं वीएस 2008 और .NET के नए संस्करण में माइग्रेट हुआ। इस संस्करण के तहत उपर्युक्त पुस्तकालय काम नहीं करता है। मैं वास्तव में एक सी # या .NET विशेषज्ञ नहीं हूं, और, सच कहने के लिए, मैं मुश्किल से समझता हूं कि उसकी लाइब्रेरी क्या करती है (हालांकि यह ओपन-सोर्स है), इसलिए मैं इसे नए .NET पर अनुकूलित करने की कोशिश भी नहीं करना चाहता हूं। हालांकि मुझे उम्मीद है कि सी # के नए संस्करण में मेरी समस्या के लिए कुछ बेहतर समाधान उपलब्ध है।

तो, अतः विशेषज्ञों, मुझे मेरे दर्द के साथ नितंबों में/मदद कृपया :)

उत्तर

40

डिफ़ॉल्ट रूप से पी आह्वान प्रणाली एक stdcall समारोह में अपने प्रतिनिधि गिर्द घूमती है।

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
public delegate void MyDelegate(); 
+0

मैं इसे करने के लिए एक सामान्य सी # समारोह प्रदान कर सकता हूँ: आप UnmanagedFunctionPointer विशेषता का उपयोग करके उत्पन्न आवरण के बुला सम्मेलन को बदल सकते हैं? –

+0

हाँ आप यह कर सकते हैं। –

+0

बहुत बहुत धन्यवाद। अच्छी तरह से काम। आपने मेरा दिन बचा लिया! –