Маршаллинг сложных структур. Для тех, кого может заинтересов
От: 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
Re: Маршаллинг сложных структур. Для тех, кого может заинтер
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.09.02 19:13
Оценка:
Здравствуйте cocaf, Вы писали:

Не парься. Такие задачи решаются на MC++. На Шарпе ничего кроме гемороя не получишь. Вернее получишь, но геморой тебе будет обеспечен. Расплатой будет лишние 50-100 клил в длл-ке. Ну и возня с двумя языками.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.