मुझे तारों की एक सरणी में एक सूचक को मार्शल करने में कुछ परेशानी हो रही है। यह इस तरह से हानिरहित लग रहा है:स्ट्रिंग्स की एक सरणी के लिए मार्शलिंग पॉइंटर
typedef struct
{
char* listOfStrings[100];
} UnmanagedStruct;
यह वास्तव में इस तरह एक और संरचना के भीतर एम्बेडेड है:
typedef struct
{
UnmanagedStruct umgdStruct;
} Outerstruct;
अप्रबंधित कोड प्रबंधित कोड में वापस कॉल करता है और स्मृति आवंटित और मूल्यों में भरा के साथ एक IntPtr के रूप में Outerstruct रिटर्न ।
प्रबंधित दुनिया:
[StructLayout(LayoutKind.Sequential)]
public struct UnmanagedStruct
{
[MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr, SizeConst=100)]
public string[] listOfStrings;
}
[StructLayout(LayoutKind.Sequential)]
public struct Outerstruct
{
public UnmanagedStruct ums;
}
public void CallbackFromUnmanagedLayer(IntPtr outerStruct)
{
Outerstruct os = Marshal.PtrToStructure(outerStruct, typeof(Outerstruct));
// The above line FAILS! it throws an exception complaining it cannot marshal listOfStrings field in the inner struct and that its managed representation is incorrect!
}
यदि मैं सूची को बदलता हूं तो बस एक इंट्राट्रेट होने के लिए मार्शल.प्रेटोस्ट्रक्चर काम करता है लेकिन अब मैं सूची में चिपकने में असमर्थ हूं और स्ट्रिंग्स को एक-एक करके निकालने में असमर्थ हूं।
ByValArray == इन-प्लेस सरणी, LPArray == एक सरणी के लिए एक सूचक। हालांकि SizeConst को अभी भी एक एलपीएआरएआरई के साथ काम करना चाहिए, इसलिए त्रुटि जब मार्शलिंग थोड़ा अजीब था। –
ओह, अगर आपके पास सार्वजनिक स्ट्रिंग [] listOfStrings है, तो यह भी काम करना चाहिए, यह ByValArray है जो मुझे विश्वास में अंतर बनाता है। –