我试图在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。
答案 0 :(得分:0)
这是当前Mono版本固有的问题。根据Mono团队的说法,这已经从Mono 5.14开始修复。