2010-06-04 12 views
23

पर प्रबंधित प्रतिनिधि मैं प्रबंधित सी ++ (सी ++/सीएलआई) से फ़ंक्शन पॉइंटर को एक अप्रबंधित विधि में कैसे पास करूं? मैंने कुछ लेख पढ़े, जैसे this one from MSDN, लेकिन यह दो अलग-अलग असेंबली का वर्णन करता है, जबकि मुझे केवल एक चाहिए।सी ++/क्ली पास (प्रबंधित) अप्रबंधित कोड

1) हैडर (MyInterop.ManagedCppLib.h):

#pragma once 

using namespace System; 

namespace MyInterop { namespace ManagedCppLib { 

    public ref class MyManagedClass 
    { 
    public: 
     void DoSomething(); 
    }; 
}} 

2) सीपीपी संहिता (MyInterop.ManagedCppLib.cpp)

#include "stdafx.h" 
#include "MyInterop.ManagedCppLib.h" 

#pragma unmanaged 
void UnmanagedMethod(int a, int b, void (*sum)(const int)) 
{ 
    int result = a + b; 
    sum(result); 
} 

#pragma managed 
void MyInterop::ManagedCppLib::MyManagedClass::DoSomething() 
{ 
    System::Console::WriteLine("hello from managed C++"); 
    UnmanagedMethod(3, 7, /* ANY IDEA??? */); 
} 

मैं

यहाँ मेरी कोड है मेरे प्रबंधित प्रतिनिधि को बनाने का प्रयास किया और फिर मैंने Marshal::GetFunctionPointerForDelegate विधि का उपयोग करने की कोशिश की, लेकिन मैं संकलित नहीं कर सका।

+0

क्या आप कोड पोस्ट कर सकते हैं, जिसमें आपने GetFunctionPointerForDelegate का उपयोग किया था? – Simon

उत्तर

37

हां, आप मार्शल :: GetFunctionPointerForDelegate() चाहते हैं। आपके कोड स्निपेट में वह प्रबंधित फ़ंक्शन गुम है जिसे आप कॉल करना चाहते हैं, मैंने अभी एक बना दिया है। फ़ंक्शन पॉइंटर प्राप्त करने से पहले आपको प्रबंधित प्रतिनिधि प्रकार घोषित करना होगा और इसका एक उदाहरण बनाना होगा। यह अच्छी तरह से काम किया:

#include "stdafx.h" 

using namespace System; 
using namespace System::Runtime::InteropServices; 

#pragma managed(push, off) 
typedef void (* UnmanagedSummer)(int arg); 

void UnmanagedMethod(int a, int b, UnmanagedSummer sum) 
{ 
    int result = a + b; 
    sum(result); 
} 
#pragma managed(pop) 

ref class Test { 
    delegate void ManagedSummer(int arg); 
public: 
    static void Run() { 
     Test^ t = gcnew Test(); 
     ManagedSummer^ managed = gcnew ManagedSummer(t, &Sum); 
     IntPtr stubPointer = Marshal::GetFunctionPointerForDelegate(managed); 
     UnmanagedSummer functionPointer = static_cast<UnmanagedSummer>(stubPointer.ToPointer()); 
     UnmanagedMethod(1, 2, functionPointer); 
     GC::KeepAlive(managed); // Important: ensure stub can't be collected while native code is running 
     System::Diagnostics::Debug::Assert(t->summed == 3); 
    } 
    void Sum(int arg) { 
     summed += arg; 
    } 
    int summed; 
}; 

int main(array<System::String ^> ^args) 
{ 
    Test::Run(); 
    return 0; 
} 
+0

यह अतिरिक्त कास्टिंग "गायब लिंक" था :-) धन्यवाद! –

संबंधित मुद्दे