Не удается найти ошибку 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:
- Вам не хватает зависимостей встроенной библиотеки, в которую вы звоните.
- Нативный assmebly был скомпилирован для неправильной подсистемы (например, рабочего стола, а не CE)
- Собственная сборка была скомпилирована для неправильного процессора (т.е. x86, а не ARM).
- У вас недостаточно виртуальной памяти для загрузки 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.