F # интерактивный Marshal.SizeOf с Mono выдает ошибку «утверждения» - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь прочитать заголовок файла 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.

1 Ответ

0 голосов
/ 06 мая 2018

Эта проблема была присуща текущей версии Mono. Согласно команде Mono, это было исправлено в Mono 5.14.

...