В моем решении VS2010, приложение C# ссылки проекта проект библиотеки F#.
Когда a NullReferenceException
брошен от lib F#, отладчик не может найти исключение точки брошенным. Это просто не говорит 'Доступного Источника'.
Я должен изменить некоторые опции, или это - ограничение VS2010?
Я добавил некоторый пример кода:
Проект 'Library1' F#
module Module1
type AA() =
let _a = "xx"
member x.a = _a
let aa:AA option = None
let b() =
aa.Value.a // null reference occurs here
Проект 'ConsoleApp1' C#
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.Out.Write(Module1.b());
Console.In.Read();
}
}
}
Ошибка не вызвана какими-либо проблемами взаимодействия C # / F #.
Когда вы вызываете b ()
, он пытается получить доступ к значению параметра Value of a None, что вызывает исключение нулевой ссылки во время выполнения.
В библиотеке F # попробуйте заменить let aa: AA option = None
на let aa: AA option = Some (AA ())
. Затем код C # должен напечатать «xx».
При раскрытии типа параметра F # внешнему миру вы можете разрешить возвращаемое значение null из пустого параметра вместо исключения. Например:
module Module1
//attribute needed in order to be able to return null from the match statement
[<AllowNullLiteralAttribute>]
type AA() =
let _a = "xx"
member x.a = _a
let aa:AA option = None
let b() = match aa with
| None -> null
| Some value -> value
И проверьте наличие null в любом коде, который использует эту библиотеку F #.
Обратите внимание на атрибут AllowNullLiteral
. Попробуйте закомментировать этот атрибут, и вы увидите, что F # не распознает значение null в первой ветви соответствия.
В принципе, это должно работать без установки каких-либо дополнительных параметров. Несколько вещей, которые следует проверить:
Может ли среда выполнения найти файл PDB для вашей библиотеки F #?
Она должна это сделать, если файл PDB находится в том же каталоге, что и DLL. Вы также можете посмотреть окно «Вывод» и выбрать «Отладка» из комбо, чтобы увидеть информацию, распечатываемую при запуске приложения - там вы можете увидеть, были ли загружены символы или нет. Если у вас есть символы PDB в каком-то специальном каталоге, вы можете указать каталог в Инструменты -> Параметры -> Отладка -> Символы.
Что происходит, когда вы пытаетесь установить точку останова в исходном коде F #?
Говорится ли что-то вроде «символы не загружены» (и отображается точка останова серым цветом)? Показывает ли он какую-либо дополнительную информацию, которая может быть использована для поиска причины проблемы?