Маршаллинг сложных структур. Для тех, кого может заинтересов
От: cocaf  
Дата: 04.09.02 11:29
Оценка:
Для тех, кого может заинтересовать.

Согласно 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.