Как я Маршалл больших структур в VB.NET
У меня есть структура массивов, которые довольно велики. Я все время получаю исключение "исключение выброшено(vcruntime140d.dll нарушение доступа к месту записи" это происходит на члене описания.
Что я уже пробовал:
<DllImport("ConvertRaw.dll", CallingConvention:=CallingConvention.Cdecl)> Public Function OpenRawFile(<MarshalAs(UnmanagedType.LPStr)> x As String, ByRef CurrentStamp As RawDataHeader) As Integer End Function <StructLayout(LayoutKind.Sequential)> Public Structure RawDataHeader Public numChannels As Integer Public syncpattern As Integer Public runnumber As Integer Public muxpitch As Integer <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4096)> Public channels() As Integer <MarshalAs(UnmanagedType.ByValArray, SizeConst:=508)> Public description() As Byte Public scanlistblocks As Integer End Structure Dim stamp1 As New RawDataHeader Dim result As Integer Dim sizeOfHeader As Integer = Marshal.SizeOf(GetType(RawDataHeader)) Dim pHeader As IntPtr = Marshal.AllocHGlobal(sizeOfHeader) Dim i As Integer Dim x As String Try result = OpenRawFile("C:\Raw_Data\H12091.raw", pHeader) stamp1 = DirectCast(Marshal.PtrToStructure(pHeader, GetType(RawDataHeader)), RawDataHeader) Finally Marshal.FreeCoTaskMem(pHeader) End Try
Это моя структура c++
typedef struct { int numChannels; int syncpattern; int run; int datastream; int channels[4096]; char description[508] int scanlistblocks; }RawDataHeader;
Gerry Schmitz
У вас есть какие-нибудь идеи, "сколько" может быть "слишком большим"? Или начните с "одного" int и продолжайте добавлять, пока он не сломается.
Md23
ScanList() работает, но тогда, если я добавлю в DataWidths (), это не так. Я получаю эту ошибку о том, что структура слишком велика
Gerry Schmitz
64 КБ всегда было "магическим числом", не знаю, применимо ли оно к вам, но каждый из ваших блоков "4096" занимает 16 КБ.
Md23
К сожалению, именно такого размера они все и должны быть...