使用F#交互式解释器时,我观察到一些奇怪的行为。
运行以下代码:
let getType1 = Type.GetType("namespace.does.not.exist, doesntexistlib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",false);;
let getType2 = Type.GetType("namespace.does.not.exist, doesntexistlib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",false);;
即使throwOnError参数设置为false,也会导致fsi捕获FileLoadException。第一次它在第二次返回null时发生异常。
在常规程序中运行相同的代码(非交互式)会导致getType = null的预期行为。
FSI.exe是否会停止所有异常?是否可以将FSI设置为忽略这些异常?
答案 0 :(得分:2)
基于堆栈跟踪,看起来FSI正在挂钩其AppDomain的程序集分辨率。不幸的是,FSI在无法解析程序集时会抛出异常 - 这不是由框架代码生成的,这就是为什么你的throwOnError
参数没有得到尊重的原因 - FSI的例外只是向上传播然后再传播被抓到顶层。对我而言,这看起来像是FSI中的一个错误,但可能是AppDomain的程序集解析过程中的可用挂钩不能为FSI提供足够的信息来确定何时可以抛出。
编辑 - 如果查看源文件fsi.fs(包含在source / fsharp / Fsi目录中的F#发行版中),您可以看到此处理程序的连接位置(它位于令人恐惧的MagicAssemblyResolution
模块。似乎FSI需要挂钩到解决过程中,以便可以找到通过#r
指令注册的程序集,但我无法一眼就看出问题出在哪里,或者为什么没有抛出所有异常第一次尝试解决无效的程序集时到最高级别的方法。