Tôi đang gặp một số sự cố khi sắp xếp một con trỏ tới một chuỗi các chuỗi. Có vẻ vô hại như thế này:Biến đổi con trỏ thành một mảng các chuỗi
typedef struct
{
char* listOfStrings[100];
} UnmanagedStruct;
này là thực sự nhúng bên trong cấu trúc khác như thế này:
typedef struct
{
UnmanagedStruct umgdStruct;
} Outerstruct;
unmanaged code gọi lại vào mã số quản lý và trả về Outerstruct như một IntPtr với bộ nhớ được phân bổ và các giá trị điền vào .
Managed thế giới:
[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!
}
Nếu tôi thay đổi listOfStrings chỉ đơn giản là một IntPtr sau đó Marshal.PtrToStructure hoạt động nhưng bây giờ tôi không thể rip vào listOfStrings và trích xuất từng chuỗi một.
ByValArray == mảng tại chỗ, LPArray == một con trỏ tới một mảng. Mặc dù SizeConst vẫn nên làm việc với một LPArray, do đó, lỗi khi marshaling là một chút kỳ lạ. –
Ồ, điều đó cũng sẽ hoạt động nếu bạn có chuỗi công khai [] listOfStrings, đó là ByValArray tạo nên sự khác biệt mà tôi tin tưởng. –