Не удается найти ошибку PInvoke DLL в Windows Mobile

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

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

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

Ответ 1

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

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

Вы подтвердили, что точки входа DLL не декорированы с помощью dumpbin?

Ответ 2

Учитывая сообщение об ошибке, обычно существует одна из двух проблем

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

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

Ответ 3

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

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

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

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

Чтобы все было в порядке, вам нужно будет загрузить приложение раньше или удалить ненужные приложения из папки windows starup.

Ответ 4

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