Для тех, кого может заинтересовать.
Согласно MSDN-ну маршаллинг вложенного в структуру массива
C++
struct MyStruct
{
short s1[128];
}
выполняется следующим образом:
C#
[StructLayout(LayoutKind.Sequential)]
public class MyStruct
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=128)]
public short[] s1;
}
Это работает прекрасно. Но небольшое усложнение приводит к проблемам:
C++
struct Small
{
short x;
};
struct MyStruct
{
Small f[128];
};
C#
[StructLayout(LayoutKind.Sequential)]
public class Small
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=128)]
public short x;
}
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=128)]
public Small[] s1;
}
При попытке получить размер такой структуры (Marshal.SizeOf(...)), это дает ArgumentException с дополнительной информацией:
"MyStruct can not be marshaled as an unmanaged structure; no meaningful size or offset can be computed"
Почему? — Вот. что я нашел в
www.dotnet247.com
The current .NET V1 marshaler can't
handle arrays of structs inside a struct.
You have to 'flatten' your struct
--
NETMaster (Thomas Scheidegger)
http://www.cetus-links.org/oo_csharp.html