2011-03-07 16 views
10

खोने वाले हस्ताक्षर किए गए चार एक सॉफ्टवेयर के एसडीके के लिए एक डीएलएल फ़ाइल की ओर काम कर रहा है और मैं सॉफ्टवेयर के मेजबान के बारे में जानकारी प्राप्त करने के लिए एक समारोह को कॉल करने की कोशिश कर रहा हूं।पी/Invoke, सी #: एक बाइट

फ़ंक्शन चाहता है कि संरचना में दो हस्ताक्षरित चार चर (HostMachineAddress, HostProgramVersion) हैं और ऐसा लगता है कि जब मैं इसे C# से कॉल करने का प्रयास करता हूं तो मैं अंतिम बाइट को "ढीला" करता हूं ... अगर मैं आकार में बदलता हूं सी # स्ट्रक्चर से 5 तक मुझे लापता बाइट मिलता है, हालांकि यह अन्य परिवर्तनीय डेटा खो देता है।

क्या कोई मुझे इस समस्या को हल करने का कोई तरीका ढूंढने में मदद कर सकता है? भी struct के बजाय एक वर्ग का उपयोग करने की कोशिश कर system.stackoverflow त्रुटि होती है

सी # Struct

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public struct sHostInfo 
{ 
    public int bFoundHost; 
    public int LatestConfirmationTime; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
    public string szHostMachineName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)] 
    public string HostMachineAddress; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
    public string szHostProgramName; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)] 
    public string HostProgramVersion; 
} 

सी #

[DllImport("Cortex_SDK.dll")] 
public static extern int GetHostInfo(out sHostInfo pHostInfo); 
+2

HostProgramVersion और szHostProgramName आपके सी # कोड में क्यों बदल दिए गए हैं? – Fox32

उत्तर

6

आपका सी # struct के लेआउट पिछले होना चाहिए सी ++ एक (HostProgramVersion से अलग है)।

स्ट्रिंग्स के लिए ByValTStr[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] का उपयोग करके marshalled के लिए भी।

लापता अंतिम बाइट के साथ समस्या यह हो सकती है कि मार्शलर आपकी स्ट्रिंग (शून्य-समाप्त स्ट्रिंग में) के रूप में शून्य को जोड़ने की कोशिश करता है। एक स्ट्रिंग के बजाय sbyte[] + ByValArray का उपयोग करने का प्रयास करें।

+1

+1 इसके अलावा, मैं हमेशा 'StructLayoutAttribute.Pack' निर्दिष्ट करता हूं, भले ही यह यहां प्रासंगिक न हो। अंदर आने के लिए एक अच्छी आदत। –

+0

स्वैप किए गए चर के बारे में मेरी गलती क्षमा करें, हालांकि इस मुद्दे को हल नहीं किया गया है, मुझे भी डर है, चार्सेट.एन्सी भी जोड़ा। – Tistatos

+0

@ टिस्टेटोस: फिर से अपना कोड देख रहे हैं, ऐसा लगता है कि आप एक आईपीवी 4 पता/4-अंक prog.version संग्रहित कर रहे हैं? इसका मतलब है कि 4-चार सरणी वास्तव में 'sbyte' सरणी चाहिए ?! –

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