2010-03-18 13 views
17

से समारोह सूचक यह एक ग (++) स्थिर समारोह सूचक (नहीं एक प्रतिनिधि) इसकॉल C++ #

typedef int (*MyCppFunc)(void* SomeObject); 
ग # से

की तरह कॉल करने के लिए संभव है?

void CallFromCSharp(MyCppFunc funcptr, IntPtr param) 
{ 
    funcptr(param); 
} 

मुझे कुछ पुराने सी ++ कक्षाओं में सी # से कॉलबैक करने में सक्षम होना चाहिए। सी ++ प्रबंधित है, लेकिन कक्षाएं कक्षाएं (अभी तक) नहीं हैं।

अब तक मुझे नहीं पता कि सी #+ फ़ंक्शन पॉइंटर को सी # से कैसे कॉल करें, क्या यह संभव है?

+0

मुझे लगता है कि अपने सबसे अच्छे शर्त है कि के लिए एक C++/CLI आवरण तैयार करना है। – Anzurio

+0

यह मेरे लिए काम करता है, https://stackoverflow.com/questions/39790977/how-to-pass-a-delegate-or-function-pointer-from-c-sharp-to-c-and-call-it- वहां/3 9 803574 # 39803574 –

उत्तर

16

डीटीबी सही है। मार्शल.GetDelegateForFunctionPointer के लिए यहां एक और विस्तृत उदाहरण दिया गया है। यह आपके लिए काम करना चाहिए।

C++ में:

static int __stdcall SomeFunction(void* someObject, void* someParam) 
{ 
    CSomeClass* o = (CSomeClass*)someObject; 
    return o->MemberFunction(someParam); 
} 

int main() 
{ 
    CSomeClass o; 
    void* p = 0; 
    CSharp::Function(System::IntPtr(SomeFunction), System::IntPtr(&o), System::IntPtr(p)); 
} 

सी # में:

public class CSharp 
{ 
    delegate int CFuncDelegate(IntPtr Obj, IntPtr Arg); 
    public static void Function(IntPtr CFunc, IntPtr Obj, IntPtr Arg) 
    { 
    CFuncDelegate func = (CFuncDelegate)Marshal.GetDelegateForFunctionPointer(CFunc, typeof(CFuncDelegate)); 
    int rc = func(Obj, Arg); 
    } 
} 
2

Marshal.GetDelegateForFunctionPointer विधि पर एक नज़र डालें।

delegate void MyCppFunc(IntPtr someObject); 

MyCppFunc csharpfuncptr = 
    (MyCppFunc)Marshal.GetDelegateForFunctionPointer(funcptr, typeof(MyCppFunc)); 

csharpfuncptr(param); 

मैं अगर यह सच है, हालांकि अपने सी ++ विधि के साथ काम करता है MSDN प्रलेखन के रूप में कहा गया है पता नहीं है,:

आप समारोह संकेत के माध्यम से सी ++

प्राप्त के साथ इस विधि का उपयोग नहीं कर सकते
+1

विवरण कहता है: "आप इस विधि का उपयोग सी ++ के माध्यम से प्राप्त फ़ंक्शन पॉइंटर्स के साथ नहीं कर सकते" - दुख की बात है, मेरा फ़ंक्शन पॉइंटर एक सी ++ पॉइंटर है। – Sam

+1

फिर मेरा अनुमान है कि, आपके सी ++ लाइब्रेरी के लिए सी ++ में प्रबंधित (रेफरी) रैपर कक्षाएं बनाने के लिए। – dtb