Как отладить C DLL при вызове из приложения C # в Visual Studio 2008 - PullRequest
2 голосов
/ 13 октября 2010

У меня есть оконное приложение C #, которому нужно использовать сторонний API, который предлагается только на C. Чтобы решить эту проблему, я создал три проекта в рамках VS2008: два проекта C # и пустой проект C ++. , Один проект C # - это мой проект Wrapper, отвечающий только за создание управляемого кода, который вызывает C DLL. Другой проект C # - это оконное приложение, которое использует проект Wrapper; давайте назовем это проектом GUI.

Внутри проекта C ++ я создал несколько файлов C (* .c), которые используют сторонний API и экспортируют (dllexport) подходящие функции. Я могу успешно скомпилировать этот проект в DLL, и у меня не было проблем с вызовом этих функций из моего проекта Wrapper. В случае необходимости мой проект Wrapper использует атрибуты DllImport для ссылки на эти функции.

В моем проекте C ++ есть событие после сборки, которое копирует полученную DLL в выходной каталог моего проекта C # с графическим интерфейсом, чтобы он был обнаружен во время выполнения. Это немного мрачно, но это единственный способ, который я понял, как это сделать. Мой GUI-проект зависит от моего проекта Wrapper, который зависит от C ++ проекта.

Однако я изо всех сил пытаюсь отладить (то есть пошагово) код моего C-проекта. Я пытался установить точку останова в коде C в надежде, что она будет обнаружена, когда мой код C # выполнит соответствующую функцию. К сожалению, как только я запускаю свое приложение C #, среда IDE предупреждает меня, что точки останова C никогда не будут выполнены: " Для этого документа не было загружено символов ."

Любая помощь с этим будет принята с благодарностью. Вот некоторые вещи, с которыми я играл, но безрезультатно:

  • Убедитесь, что файл .pdb имеет ту же временную метку, что и файл DLL. Этот совет последовал после того, как случайный Google предположил, что это может быть вызвано ошибкой «Нет символов».

  • Я выбрал «Включена отладка неуправляемого кода» в свойствах моего проекта C #.

  • Я попытался установить точку останова в своем вызове C # непосредственно перед вызовом одного из методов DLL и попытался войти в DLL. Это тоже не сработало, просто перешагнуло через функцию.

1 Ответ

0 голосов
/ 13 октября 2010

Вы должны проверить в списке модулей (обычно находится в меню отладки в Visual Studio), чтобы убедиться, что:

  • Модуль загружен
  • загружается из правильного места
  • Символы были правильно загружены

Если в окне указан модуль, но указано, что символы не загружены, вы можете заставить VS загружать символы, щелкнув правой кнопкой мыши по модулю и выбрав «Загрузить символы». Если он не может найти их автоматически, он запросит путь.

...