У меня есть следующие вложенные структуры.C# вложенная структура маршалинга - объект
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct ERROR_ITEM
{
byte ErrorID;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct ERROR_DATA
{
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 10)]
ERROR_ITEM[] ErrorItem;
};
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct VCP_DATA
{
[MarshalAs(UnmanagedType.Struct)]
ERROR_DATA ErrorData;
};
мне нужно скопировать массив байтов в этой структуре, поэтому я попытался следующий
vcpBuffer = new VCP_DATA();
GCHandle handle = GCHandle.Alloc(vcpBuffer, GCHandleType.Pinned);
try
{
IntPtr pBuffer = handle.AddrOfPinnedObject();
Marshal.Copy(bytarray, 0, pBuffer, length);
}
finally
{
if (handle.IsAllocated)
handle.Free();
}
Но GCHandle.Alloc() возвращает ошибку «необработанное исключение типа System.Argument.Execption "произошел в mscorlib.dll. Дополнительная информация: Объект содержит не примитивные или невоспроизводимые данные.
Спасибо за предложения. Я уверен, что они будут работать, но я нашел другой способ сделать то, что мне нужно. vcpBuffer = новый VCP_DATA(); GCHandle handle = GCHandle.Alloc (bytearray, GCHandleType.Pinned); \t try { IntPtr pBuffer = handle.AddrOfPinnedObject(); vcpBuffer = (VCP_DATA) Marshal.PtrToStructure (pBuffer, typeof (VCP_DATA)); } окончательный { если (рукоятка.IsAllocated) ручка.Free(); } – Hassan
@ Hassan - Вы должны сделать ответ и принять его! Это законно сделать это и улучшить сайт. – hoodaticus