Источник недоступен при отладке приложения C #, которое ссылается на F # lib - PullRequest
1 голос
/ 18 июля 2010

В моем решении VS2010 проект приложения C # ссылается на проект библиотеки F #.

Когда из F # lib выбрасывается NullReferenceException, отладчик не может найти выброшенное исключение точки. Он просто говорит «Источник недоступен».

Должен ли я изменить некоторые параметры или это ограничение VS2010?

Я добавил пример кода:

F # проект 'Библиотека1'

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

C # проект 'ConsoleApp1'

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.Out.Write(Module1.b());
            Console.In.Read();
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 18 июля 2010

Это должно, в принципе, работать без установки каких-либо дополнительных опций.Несколько вещей для проверки:

  • Может ли среда выполнения найти файл PDB для вашей библиотеки F #?

    Это следует сделать, если файл PDB находится в том же каталоге, что иDLL.Вы также можете посмотреть в окне «Вывод» и выбрать «Отладка» в комбинированном списке, чтобы увидеть информацию, напечатанную при запуске приложения - там вы можете увидеть, были ли загружены символы или нет.Если у вас есть символы PDB в каком-то специальном каталоге, вы можете указать каталог в Сервис -> Параметры -> Отладка -> Символы.

  • Что происходит, когда вы пытаетесь установить точку останова вF # source?

    Это говорит что-то вроде "символы не загружены" (и показывает точку останова серым цветом)?Показана ли какая-либо дополнительная информация, которая может быть использована для поиска причины проблемы?

0 голосов
/ 18 июля 2010

Ошибка не вызвана проблемами взаимодействия C # / F #.Когда вы вызываете b(), он пытается получить доступ к значению параметра «Значение Нет», которое выдает исключение нулевой ссылки во время выполнения.

В библиотеке F # попробуйте заменить let aa:AA option = None на let aa:AA option = Some(AA()).Код C # должен затем напечатать 'xx'.

Когда вы открываете тип опции F # для внешнего мира, вы можете разрешить пустое возвращаемое значение из пустой опции вместо исключения.Например:

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 

И проверьте наличие нуля в любом коде, который использует эту библиотеку F #.

Обратите внимание на атрибут AllowNullLiteral.Попробуйте закомментировать этот атрибут, и вы увидите, что F # не распознает значение null в первой ветви соответствия.

...