मेरे पास यह सी ++ कोड है:क्या मुझे अप्रबंधित कोड में मार्शल.PtrToStructure के माध्यम से marshaled संरचनाओं को हटाने की जरूरत है?
extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo)
{
*foo = new MY_DATA_STRUCTURE;
//do stuff to foo
}
फिर सी # में मैं इस प्रकार फ़ंक्शन को कॉल करता हूं:
[DllImport("MyDll.dll")]
static extern void AllocateFoo(out IntPtr pMyDataStruct);
...
MyDataStructure GetMyDataStructure()
{
IntPtr pData;
ManagedAllocateFooDelegate(out pData);
MyDataStructure foo = (MyDataStructure)Marshal.PtrToStructure(pData, typeof(MyDataStructure));
return foo;
}
जहां MyDataStructure एक संरचना (कक्षा नहीं) है जो MY_DATA_STRUCTURE से मेल खाती है और सदस्यों को उचित तरीके से मार्शल किया जाता है।
तो प्रश्न: क्या मुझे पीडीटा को स्टोर करने की आवश्यकता है और फिर इसे फिर से अप्रबंधित कोड में रिलीज़ करें जब MyDataStructure GC'd है? एमएसडीएन मार्शल .PtrToStructure (IntPtr, टाइप) के लिए कहता है: "मार्शल डेटा को स्मृति के एक अप्रबंधित ब्लॉक से निर्दिष्ट प्रकार के एक नए आवंटित प्रबंधित ऑब्जेक्ट में डेटा।" उस वाक्य में "मार्शल" का अर्थ "प्रतिलिपि" है? इस मामले में मुझे (IntPtr pData) को संरक्षित करने की आवश्यकता होगी और फिर इसे अप्रबंधित कोड (MyDataStructure destructor में) पास कर दें ताकि मैं एक C++ "हटाएं" कर सकूं?
मैंने खोजा है लेकिन मैं इसके लिए पर्याप्त स्पष्ट उत्तर नहीं ढूंढ सकता।
आपका अप्रबंधित फ़ंक्शन, AllocateFoo, लिखित के रूप में काम नहीं करता है। पॉइंटर को वापस कॉलर पर वापस करने के लिए आपको एक अतिरिक्त स्तर की संकेत की आवश्यकता है। i.e., AllocateFoo (MY_DATA_STRUCTURE * * foo) { * foo = new MY_DATA_STRUCTURE; } – GBegen
हाँ आप सही हैं! मेरा वास्तविक कोड PMY_DATA_STRUCTURE * का उपयोग करता है, मैं पोस्ट संपादित करूंगा। – Serguei