2009-05-06 12 views
9

मैं सी # + सी पुस्तकालय में सी # से संरचना को पारित करने की कोशिश कर रहा हूं। मैं संरचना को एक ऑब्जेक्ट के रूप में पास करता हूं, और सी ++ फ़ंक्शन इसे पॉइंटर (शून्य *) के रूप में अपेक्षा करता है।मैं एक संरचना के लिए एक सूचक के रूप में एक संरचना कैसे मार्शल कर सकते हैं?

मुझे संरचना को पार करने में समस्या आ रही है।

"मार्शल नहीं किया जा सकता 'पैरामीटर # 1':

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec); 

यहाँ रन-टाइम अपवाद पाठ मैं मिलता है अमान्य कामयाब/अप्रबंधित प्रकार संयोजन (यह मान प्रकार Struct के साथ रखा जाना चाहिए)। "

हालांकि मुझे एक एमएसडीएन आलेख मिला जो वास्तव में इस संदर्भ में एलपीएसट्रक्चर का उपयोग करता है।

यह मेरा संरचना मैं मार्शल करने के लिए कोशिश कर रहा हूँ है:

[StructLayout(LayoutKind.Sequential)] 
public struct UserRec { 
    [MarshalAs(UnmanagedType.I4)] 
    public int userParam1; 
} 

यह वह जगह है सी ++ समारोह:

MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {... 

उत्तर

17

एक रेफरी पैरामीटर के रूप में संरचना गुजर कोशिश करो।

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] 
public static extern IntPtr TheFunction(ref UserRec userRec); 

जब आप संरचना के साथ संयुक्त रेफरी का उपयोग करते हैं, तो यह अवधारणात्मक रूप से पते को पास करता है।

+4

मुझे लगता है कि आपको इस मामले में [मार्शल] की भी आवश्यकता नहीं है। –

+0

@ एंटन, आप सही हैं (अपडेटेड) – JaredPar

+0

अंतिम कार्य परिणाम: सार्वजनिक स्थैतिक बाहरी IntPtr TheFunction ([मार्शलएएस (UnmanagedType.Struct), में] ref UserRec userRec); और [मुर्शल] यहां बस इसे स्पष्ट करने के लिए है, लेकिन आवश्यक नहीं है। –

13

संयोग से, UnmanagedType.LPStruct शायद ही कभी, सही MarshalAs तर्क है। A quote from Adam Nathan जो एक माइक्रोसॉफ्ट कर्मचारी है:

UnmanagedType.LPStruct केवल एक विशिष्ट मामले के लिए समर्थित है: अविवेक की एक अतिरिक्त स्तर के साथ एक अप्रबंधित GUID के रूप में एक System.Guid मान प्रकार के इलाज के।

+0

लेकिन मैं चाहता था कि यह PROPERTYKEY के लिए काम करे: '( – jnm2

+0

बीटीडब्ल्यू, यह क्यों है, इसकी व्याख्या के लिए धन्यवाद। यही मैं वास्तव में चाहता था। – jnm2

+0

(रुको, यह पागलपन क्या है? मैंने हस्ताक्षर में' रेफरी 'का इस्तेमाल किया लेकिन नहीं कॉल साइट पर! सी # भाषा में COM इंटरफेस के लिए अपवाद होना चाहिए?) – jnm2

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