Я не уверен, что вызывает нарушение прав доступа, но эта строка:
Marshal.StructureToPtr(value, new IntPtr(buffer.ToInt32() + offset), false);
Кажется подозрительным.Замена кода с более разумным использованием класса IntPtr
может помочь:
buffer = Marshal.AllocHGlobal(size);
offset = buffer;
for (var index = 0; index < length; index++)
{
Marshal.StructureToPtr(value, offset, false);
IntPtr.Add(offset, Marshal.SizeOf(type));
}