Не удается найти ошибку PInvoke DLL в Windows Mobile - PullRequest
12 голосов
/ 21 сентября 2009

У меня много проблем с настройкой базового сценария для работы на эмуляторе Windows Mobile 5.0. У меня есть приложение winforms, которое в конечном итоге вызывает нативный код. Развертывание работает нормально, и все собственные библиотеки DLL копируются в ту же папку, что и winforms .exe. Я также подтвердил, что это относится к инструменту Remote File Viewer.

Однако, когда я запускаю свое приложение, оно всегда завершается с ошибкой «Не удается найти PInvoke dll - System.MissingMethodException» (когда приходит время вызова нативного кода, атрибут DllImport становится бесполезным). Я знаю , что нативный dll находится в той же папке, что и исполняемый файл. Что еще мне делать?

Я использую VS 2008.

Ответы [ 4 ]

8 голосов
/ 22 сентября 2009

Чтобы расширить ответ Джареда, еще четыре распространенных причины получить исключение MissingMethodException при P / Invoking в CF:

  1. Вам не хватает зависимостей нативной библиотеки, в которую вы звоните.
  2. Собственная сборка была скомпилирована для неверной подсистемы (т.е. рабочего стола, а не CE)
  3. Собственная сборка была скомпилирована для неправильного процессора (т.е. x86, а не ARM)
  4. У вас недостаточно виртуальной памяти для загрузки DLL.

Вы проверили, что точки входа DLL не украшены чем-то вроде dumpbin ?

5 голосов
/ 21 сентября 2009

При появлении сообщения об ошибке обычно возникает одна из 2 проблем

  1. Не удается найти DLL. Чтобы найти библиотеку DLL, посмотрите каталог выполнения и переменную среды PATH
  2. Не удается найти функцию в DLL. Вы проверили, чтобы убедиться, что и объявление, и определение DLL являются внешними "C" и помечены как __declspec(dllexport)

Кроме того, проверка работоспособности заключается в том, чтобы убедиться, что имя DLL написано правильно и не содержит суффикса .dll.

0 голосов
/ 29 декабря 2009

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

WM5 выделяет 32 слота по 32 МБ для приложений, на которые они могут работать.

Каждый раз, когда WM5 выделяет память для dll, он использует минимум 64Kb блока, поэтому, если ваша DLL 32K, это займет 64K, если ваша DLL занимает 68k, то WM5 выделит 2x64Kb - 128Kb.

Когда WM5 загружает необходимую DLL, она всегда будет загружаться по нижнему адресу предварительно загруженного приложения, т. Е. Если приложение 1 загрузило библиотеки DLL размером 2 × 30 КБ, первое будет загружено по адресу от 0 до 64 КБ, второе из 64–128, тогда ваше приложение будет загружать свои библиотеки DLL из 128 КБ, а не 0, даже если ваши приложения работают в отдельном слоте.

Для того, чтобы все заработало, вам придется загрузить приложение раньше или удалить ненужные приложения из папки Windows Starup.

0 голосов
/ 29 сентября 2009

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

...