F#交互式Marshal.SizeOf与Mono抛出“断言”错误

时间:2018-05-01 22:17:06

标签: f# mono visual-studio-mac f#-interactive

我试图在Mac OSX上使用Mono 5.8将GIF文件头读入F#结构。以下代码示例在Windows 10上的Visual Studio 2017中正常工作;但是,当我尝试在Visual Studio for Mac中运行它时,我在F#interactive中遇到以下错误:

* 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
    }

当我在Visual Studio for Mac的FSI中调用Marshal.SizeOf(typeof<GifHeader>)时,我收到上述错误。

我注意到当我读到像这样的结构时:

[<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 :(得分:0)

这是当前Mono版本固有的问题。根据Mono团队的说法,这已经从Mono 5.14开始修复。