Feedback

VB - Generic struct<->byte[] Marshalling

Veröffentlicht von am 27.06.2015
(0 Bewertungen)
A very small class that offers generic methods for marshalling byte arrays to structures and backwards. Structures must be signed as sequential by StructLayout attribute.
GFU-Schulungen  [Anzeige]

ASP.NET Core - Der Einstieg

In nur 3 Tagen lernen Sie, wie man mit ASP.NET Core und den Technologien MVC, Entity Framework, WebAPI und Razor professionelle Web-Anwendungs-Architekturen aufbaut. Diese Schulung ist der perfekte Einstieg, um datengetriebene und präsentations-orientierte Applikationen auf Basis der ASP.NET Core Plattform zu erstellen.

C# Aufbaukurs

Sie haben grundlegende .NET- und C#-Kenntnisse und und wollen diese nun erweitern. Der Aufbaukurs C# führt Sie ein die Arbeit mit Interfaces und Delegates, Generics und Parallel Computing.

Imports System.Runtime.InteropServices

Public Class SequentialStructureMarshalling

Public Shared Function StructureToByteArray(Of TStructure As Structure)(sourceStructure As TStructure) As Byte()
        Dim structureType As Type = GetType(TStructure)

        If structureType.StructLayoutAttribute.Value <> LayoutKind.Sequential Then
            Throw New ArgumentException("The generic type parameter TStructure must be sequential, but was not!", "TStructure")
        End If

        Dim structureSize As Integer = Marshal.SizeOf(structureType)
        Dim destinationPointer As IntPtr = Marshal.AllocHGlobal(structureSize)

        Marshal.StructureToPtr(sourceStructure, destinationPointer, True)

        Dim byteArray(structureSize - 1) As Byte

        Marshal.Copy(destinationPointer, byteArray, 0, structureSize)
        Marshal.FreeHGlobal(destinationPointer)

        Return byteArray
    End Function

    Public Shared Function ByteArrayToStructure(Of TStructure As Structure)(startIndex As Integer, ParamArray byteArray As Byte()) As TStructure
        If startIndex < 0 Then
            Throw New ArgumentException("The startIndex parameter must be greater than 0, but was not!", "startIndex")
        End If

        Dim structureType As Type = GetType(TStructure)

        If structureType.StructLayoutAttribute.Value <> LayoutKind.Sequential Then
            Throw New ArgumentException("The generic type parameter TStructure must be sequential, but was not!", "TStructure")
        End If

        Dim structureSize As Integer = Marshal.SizeOf(structureType)

        If byteArray.Length < (startIndex + structureSize) Then
            Throw New ArgumentException("The length of the byteArray parameter must be greater or equal to the structure length plus startIndex, but was not!", "array")
        End If

        Dim destinationPointer As IntPtr = Marshal.AllocHGlobal(structureSize)
        Marshal.Copy(byteArray, startIndex, destinationPointer, structureSize)

        Dim structureResult As TStructure = DirectCast(Marshal.PtrToStructure(destinationPointer, structureType), TStructure)
        Marshal.FreeHGlobal(destinationPointer)

        Return structureResult
    End Function

End Class
Abgelegt unter Marshalling, Byte, Array, Structure.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!