Странное поведение Fsi.exe

Я наблюдаю странное поведение при использовании интерактивного интерпретатора 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);;

приводит к тому, что fsi перехватывает исключение FileLoadException, даже если для параметра throwOnError установлено значение false. Первый раз, когда он возвращает ноль, во второй раз происходит исключение.

Выполнение того же кода в обычной программе (не в интерактивном режиме) приводит к ожидаемому поведению, где getType = null.

Останавливает ли FSI.exe все исключения? Можно ли настроить FSI, чтобы игнорировать эти исключения?

1 ответ

Решение

Судя по трассировке стека, похоже, что FSI подключается к разрешению сборки своего AppDomain. К сожалению, FSI создает само исключение, когда не может разрешить сборку - это не генерируется фреймворковым кодом, и поэтому ваш throwOnError параметр не соблюдается - исключение FSI просто распространяется вверх, а затем перехватывается на верхнем уровне. Для меня это выглядит как ошибка в FSI, но может случиться так, что доступные хуки в процессе разрешения сборки AppDomain не предоставляют FSI достаточно информации, чтобы определить, когда можно бросить.

РЕДАКТИРОВАТЬ - Если вы посмотрите в исходный файл fsi.fs (включенный в дистрибутив F# в каталоге source/fsharp/Fsi), вы можете увидеть, где подключен этот обработчик (он в пугающе названном MagicAssemblyResolution модуль). Похоже, что FSI необходимо подключиться к процессу разрешения, чтобы сборки, зарегистрированные через #r Директива может быть найдена, но я не могу с первого взгляда сказать, где что-то идет не так, или почему не возникает исключение вплоть до верхнего уровня при первой попытке разрешить недопустимую сборку.

Другие вопросы по тегам