【发布时间】:2009-08-24 17:55:04
【问题描述】:
我在编组指向字符串数组的指针时遇到了一些麻烦。它看起来像这样无害:
typedef struct
{
char* listOfStrings[100];
} UnmanagedStruct;
这实际上嵌入在另一个结构中,如下所示:
typedef struct
{
UnmanagedStruct umgdStruct;
} Outerstruct;
非托管代码回调托管代码,并将 Outerstruct 作为 IntPtr 返回,其中分配了内存并填充了值。
托管世界:
[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!
}
如果我将 listOfStrings 更改为简单的 IntPtr,那么 Marshal.PtrToStructure 可以工作,但现在我无法翻入 listOfStrings 并一一提取字符串。
【问题讨论】:
标签: c# pinvoke unmanaged marshalling