Как решить проблему исключения .NET CF «Не удается найти PInvoke DLL»? - PullRequest
5 голосов
/ 26 ноября 2008

Это для всех гуру C #. Я уже давно бьюсь об этом, пробовал всевозможные советы в сети, но безрезультатно. Действие происходит в Windows Mobile 5.0.

У меня есть DLL с именем MyDll.dll. В MyDll.h у меня есть:

extern "C" __declspec(dllexport) int MyDllFunction(int one, int two);

Определение MyDllFunction в MyDll.cpp:

int MyDllFunction(int one, int two)
{
    return one + two;
}

Класс C # содержит следующее объявление:

[DllImport("MyDll.dll")]
extern public static int MyDllFunction(int one, int two);

В том же классе я вызываю MyDllFunction следующим образом:

int res = MyDllFunction(10, 10);

И вот тут-то и появляется эта кровавая штука "Не могу найти PInvoke DLL 'MyDll.dll'". Я подтвердил, что на самом деле могу выполнять PInvoke для системных вызовов, таких как «GetAsyncKeyState (1)», объявленных как:

    [DllImport("coredll.dll")]
    protected static extern short GetAsyncKeyState(int vKey);

MyDll.dll находится в той же папке, что и исполняемый файл, и я также попытался поместить его в папку / Windows без изменений и безуспешно. Любые советы или решения приветствуются.

Ответы [ 4 ]

4 голосов
/ 06 января 2009

У меня та же проблема, но на этот раз нет очевидной разницы в задействованных платформах. Почему это что-то, что должно быть «нормальным», так плохо документировано, так сложно и, что хуже всего, так «неестественно». Существуют ли ЛЮБЫЕ инструменты, которые позволяют мне перейти на мой эмулятор PPC и остановить пошаговую проверку (a), что dll находится там, где CLR ожидает этого (я поместил ее как в один каталог, так и в каталог windows на эмуляторе - можно увидеть, что там назначен проводник файлов эмуляторов), (b) что CLR может загрузить его (имеет достаточно памяти и т. д.), (c) что CLR может затем найти, какие функции присутствуют (полезно, если я могу выйти за пределы глупой 'can ошибка 'tll dll')

Я бы хотел заставить Гейтса или любую команду «Windows Mobile» использовать созданное ими дерьмо.

2 голосов
/ 26 ноября 2008

Может быть, это кажется очевидной вещью для проверки, но вы компилируете нативную DLL для правильной архитектуры процессора? IIRC, Windows Mobile работает на нескольких архитектурах ЦП.

0 голосов
/ 26 апреля 2013

У меня такая же проблема. Я использовал Depends.exe для поиска dll-зависимостей WinCE, и это зависит от dll отладки. (MSVCR90D.dll) Чтобы решить эту проблему, я скомпилировал релизную версию и подтвердил зависимости, после этого она работает нормально.

Я надеюсь помочь

0 голосов
/ 26 ноября 2008

Исключение, которое вы перечислили, и подпись pinvoke, которую вы указали в вопросе, имеют разные имена: MyDll.dll и ThreadBenchLib.dll соответственно. Это опечатка или проблема?

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

...