F#System.TypeLoadException

时间:2016-09-20 09:08:08

标签: f# mono visual-studio-code typeloadexception

通过此代码

module ObjectRe =
  type BM = A | N
  type Object = {
    Name: string
    Pattern: BM array
  }

  let patterns = [|{Name = "Pro"; Pattern = [|A;N;N;A|]} |]

我总是收到此错误消息

System.TypeLoadException: Could not load type 'FSI_0007+ObjectRe+Object[]' from assembly 'FSI-ASSEMBLY, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
  at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00038] in <94fd79a3b7144c54b4cb162b50fc7761>:0 
Stopped due to error

有人有想法吗?我在Mac上使用Visual Studio Code。

谢谢

1 个答案:

答案 0 :(得分:7)

我也可以在macOS 10.11,mono 4.6上重现这个。

最小的复制是:

module X =
    type Y = Y
    let l = [| Y |]

使用解决方法

module X =
    type Y = Y
    let g = List.toArray [ Y ]

因此,在您的情况下,替换 内部外部 [| |]声明。

为什么只在VS Code / fsharpi中发生这种情况,但在Xamarin中却没有?

如果启动活动监视器,您将看到VS Code / fsharpi使用 /Library/Frameworks/Mono.framework/Versions/4.6.0/lib/mono/4.5/fsi.exe二进制文件,但Xamarin Studio使用FCS Xamarin Studio.app/Contents/Resources/lib/monodevelop/AddIns/BackendBindings/MonoDevelop.FSharpInteractive.Service.exe您还可以检查来自交互式(F# Interactive for F# 4.1的第一条消息的版本,这些版本可能不同)。

最后,我相信这是单声道+动态程序集的错误,由fsi发出的代码触发。将此代码编译为exe在所有平台上都可以正常工作(如果检查生成的IL似乎很正常)。