DateTimeおよびDateTimeOffsetはアンマネージ呼び出しに使用することはできません。 Marshal.SizeOfメソッドによるサイズの取得や、Marshal.PtrToStructureメソッドによるポインタからの変換なども、例外エラーがスローされ、失敗します。
DateTime・DateTimeOffsetはアンマネージ呼び出しで使用することができない
Imports System
Imports System.Runtime.InteropServices
Class Sample
Shared Sub Main()
' DateTimeのサイズを取得しようとする
Console.WriteLine(Marshal.SizeOf(GetType(DateTime)))
' ハンドルされていない例外: System.ArgumentException: 型 'System.DateTime' はアンマネージ構造体としてマーシャリングできません。有効なサイズ、またはオフセットの計算ができません。
' 場所 System.Runtime.InteropServices.Marshal.SizeOfHelper(Type t, Boolean throwIfNotMarshalable)
' 場所 Sample.Main()
' ポインタからDateTimeに変換しようとする
Dim ptr As IntPtr = Marshal.AllocHGlobal(32) ' 適当なサイズの領域を確保 (何らかのデータが格納されていると仮定)
Dim dt As DateTime = CType(Marshal.PtrToStructure(ptr, GetType(DateTime)), DateTime)
' ハンドルされていない例外: System.ArgumentException: 指定された構造体は高速転送型か、またはレイアウト情報を含んでいなければなりません。
' パラメーター名: structure
' 場所 System.Runtime.InteropServices.Marshal.PtrToStructureHelper(IntPtr ptr, Object structure, Boolean allowValueClasses)
' 場所 System.Runtime.InteropServices.Marshal.PtrToStructure(IntPtr ptr, Type structureType)
' 場所 Sample.Main()
End Sub
End Class
アンマネージ呼び出しで日時の値を扱いたい場合は、DateTime・DateTimeOffsetをToFileTimeやToBinaryなどのメソッドで変換したり、Ticksプロパティなどの値を用いたりするなど、値を別のフォーマットに変換する必要があります。