Вы не должны делать это в VB.NET.
Есть и другие способы, такие как определение операторов преобразования из одного типа в другой и последующее их использование в коде:
Private Structure t1
Public a As Short
Public b As Short
End Structure
Private Structure t2
Public v As Integer
Public Shared Widening Operator CType(ByVal v As t1) As t2
Return New t2 With {.v = v.a Or (CType(v.b, Integer) << 16)}
End Operator
End Structure
Sub Main()
Dim v1 As t1, v2 As t2
v2 = v1 ' Works!
End Sub
Однако, если вы чертовски уверены, что вам нужно выполнить побайтовое копирование, и вы знаете о проблемах выравнивания и довольны ими, то вы можете сделать это:
Imports System.Runtime.InteropServices
Public Function CopyStructure(ByVal s As Object, ByVal ResultType As System.Type) As Object
Dim h As GCHandle
Try
h = GCHandle.Alloc(s, GCHandleType.Pinned)
Return Marshal.PtrToStructure(h.AddrOfPinnedObject, ResultType)
Finally
If h.IsAllocated Then h.Free()
End Try
End Function
Sub Main()
Dim v1 As t1, v2 As t2
v2 = DirectCast(CopyStructure(v1, GetType(t2)), t2)
End Sub