RCLIO писал(а):то придется все переменные последовательно перечислять?
Нет, вот решение.
Возьмем произвольную
простую структуру, над которой будем ставить опыты:
- Код: Выделить всё
<StructLayout(LayoutKind.Explicit, Size:=26)> Public Structure MyData
<FieldOffset(0)> Dim var1 As Integer '4
<FieldOffset(4)> Dim var2 As Byte '1
<FieldOffset(5)> Dim var3 As Short '2
<FieldOffset(7)> Dim var4 As Integer '4
<FieldOffset(11)> Dim var5 As Long '8
<FieldOffset(19)> Dim var6 As Short '2
<FieldOffset(24)> Dim var7 As UInt16 '2
End Structure
Произвольная инициализация:
- Код: Выделить всё
Dim test As New MyData With {.var1 = 256245625, .var2 = 54, .var3 = 6573, .var4 = 90525222, .var5 = 35784867212156, .var6 = 3567, .var7 = 9245}
1 вариант работы:
- Код: Выделить всё
Dim ptr As IntPtr = Marshal.AllocHGlobal(25)
Marshal.StructureToPtr(test, ptr, False)
Dim test2 As MyData = CType(Marshal.PtrToStructure(ptr, GetType(MyData)), MyData)
Marshal.FreeHGlobal(ptr)
2ой:
- Код: Выделить всё
Dim arr(25) As Byte
Dim gc As GCHandle = GCHandle.Alloc(arr, GCHandleType.Pinned)
Marshal.StructureToPtr(test, gc.AddrOfPinnedObject, False)
Dim test3 As MyData = CType(Marshal.PtrToStructure(gc.AddrOfPinnedObject, GetType(MyData)), MyData)
Тебе нужен, скорее всего, второй, т.к. там идет работа с доступным для редактирования массивом. В общем, попробуй приделать такой код под свои нужды, но если что - спрашивай, все-таки это уже довольно непростая область работы
Да, т.к. работа идет с памятью, не забывай освобождать ее, а то "утечки" получаться:
If gc.IsAllocated Then gc.Free()