Я пытаюсь прочитать заголовок файла GIF в структуру с F #, используя Mono 5.8 на Mac OSX. Следующий пример кода отлично работает в Visual Studio 2017 для Windows 10; однако, когда я пытаюсь запустить его в Visual Studio для Mac, я получаю следующую ошибку в интерактивном режиме F #:
* Assertion at class-accessors.c:138, condition `mono_class_has_static_metadata (klass)' not met
Код, который я использую ниже. Структура, вероятно, неверна, так как я просто быстро скомбинировал ее для вопроса, но
open System
open System.IO
open System.Runtime.InteropServices
[<Struct; StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)>]
type GifHeader = {
[<MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)>]
signature: string
[<MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)>]
version: string
logicalWidth: int16
logicalHeight: int16
}
Когда я вызываю Marshal.SizeOf(typeof<GifHeader>)
в Visual Studio для FSI Mac, я получаю ошибку, упомянутую выше.
Я заметил, что когда я читаю в структуру вроде:
[<Struct; StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)>]
type SomeOtherHeader = {
field1: uint16
field2: int32
field3: int16
field4: float
}
т.е. без спецификации MarshalAs UnmanagedType ошибка не выдается.
Кто-нибудь знает, что означает эта ошибка? Я не видел каких-либо других случаев этой конкретной ошибки в Google или других сообщениях SE, и это особенно удивительно, поскольку это не происходит в Windows / .NET Framework 4.7. Отсутствие интерактивного окна для тестирования кода является серьезным препятствием для обучения и вызывает разочарование, поскольку я не думаю, что можно использовать альтернативный (не моно) FSI.