Загрузка собственной библиотеки DLL в качестве модуля отладки в управляемом коде C # для Windows CE - PullRequest
3 голосов
/ 11 июля 2009

Я пишу приложение Windows CE на C #, которое ссылается на собственную C ++ DLL (которую я также кодирую), используя следующий метод:

   [DllImport("CImg_IP_CE.dll")]
   public static unsafe extern void doBlur(byte* imgData, int sigma);

Это на самом деле работает нормально, но я не могу отладить DLL. Когда я проверяю отладочные модули, которые загружаются после запуска EXE, CImg_IP_CE.dll не является одним из них. Даже после успешного вызова функций из DLL она все равно не отображается в списке модулей.

После осмотра кажется, что функция LoadLibrary () может работать, но я не могу найти никаких примеров использования этого в приложении C # Windows CE. Как мне это сделать, или есть лучший способ убедиться, что DLL загружается для отладки?

Ответы [ 3 ]

4 голосов
/ 11 июля 2009

Я нашел ответ через этот пост:

http://www.eggheadcafe.com/conversation.aspx?messageid=31762078&threadid=31762074

В итоге, тот же вопрос был задан, и ответ был:

Нет, вы не можете перейти от управляемого кода через вызов P / Invoke к нативному код в отладчике смарт-устройства. Вы можете использовать Attach to Процесс для выполнения собственной отладки (с загруженным в тот экземпляр VS2005), или просто пишите отладочную информацию с родного DLL к последовательному порту или что-то. Это действительно не очень часто, тем не менее, когда вам действительно нужно , чтобы перейти от одного к другому.

Далее в теме кто-то придумал, как это сделать:

Быстрый тест показывает, что самый простой способ справиться с этим - запустить вашу DLL. То есть установите параметры отладки для запуска управляемого кода EXE, который будет использовать вашу DLL и установить точки останова в DLL (все из проекта DLL, конечно). Естественно, когда EXE запускается, ваша DLL не будет загружена, поэтому вы увидите точки останова в виде пустотелых кругов! на них, но, когда вы вызовите любую из встроенных функций в вашей DLL, DLL будет загружена (это не загружается при запуске), и точки останова будут установлены.

Странно, но когда вы запускаете программу на C # и делаете вызов нативному коду DLL, он все равно не отображается как загруженный в окне отладочных модулей. Однако, если вы зададите проект DLL в качестве запускаемого проекта, а затем зададите Remote Executable в качестве файла EXE в параметрах отладки, теперь при первом вызове DLL он будет загружен в отладчик. Ладно ... все работает!

1 голос
/ 11 июля 2009

К сожалению, похоже, что отладка в смешанном режиме WinCE не поддерживается. То есть вы можете отлаживать ваш процесс как управляемый (так что вы можете пошагово проходить и устанавливать точки останова в вашем коде C #), или как собственный (так что вы можете сделать то же самое для собственного кода, включая эту DLL), но не оба на в то же время.

Чтобы запустить отладку в основном режиме для проекта C #, вы можете сделать это: запустить приложение без отладки (Ctrl + F5 или Отладка -> Запустить без отладки), затем Отладка -> Присоединить к процессу, установите «Транспорт» в Smart Device ", выберите эмулятор из выпадающего списка" Qualifier ", нажмите кнопку" Select "в поле" Attach to "и отметьте" Native ". Вы заметите, что он не позволит вам проверить оба одновременно, но если вам нужно только отладить DLL, этого может быть достаточно ...

0 голосов
/ 11 июля 2009

Если вы можете вызывать функцию в DLL, не вызывая приложения, вы, скорее всего, загружаете DLL. Возможно, вам придется убедиться, что в свойствах вашего проекта включена неотлаженная отладка.

Невозможно установить точки останова в C DLL, используемой C ++ / CLI, вызываемой из C #

...