«System.EntryPointNotFoundException» при попытке вызова неуправляемой функции из C # - PullRequest
3 голосов
/ 06 марта 2012

У меня наконец есть законченная C ++ DLL, но у меня возникают проблемы с вызовом из C #. Это определенно находит DLL, так как когда я удаляю ее из папки, я получаю другое исключение, «DLLNotFoundException». Полное описание ошибки: «Не удается найти точку входа с именем« GetNewInstance »в DLL« CComms.dll »». Все функции экспортируются в C ++, например,

__declspec(dllexport) DWORD __stdcall GetNewInstance();

и я называю это из C # примерно так

[DllImport("CComms.dll")]
private static extern uint GetNewInstance();
// ... and in main
uint inst = GetNewInstance();

Когда я использую «dumpbin / exports CComms.dll», я получаю странный вывод, я не уверен, искажается ли имя функции, и поэтому он не может найти точку входа

7    6 00002FB0 ?GetNewInstance@@YGKXZ = ?GetNewInstance@@YGKXZ (unsigned long
__stdcall GetNewInstance(void))   

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2014

Имеет ту же проблему с VB.NE Не получило это исключение, если функция объявлена ​​без __stdcall, но с предупреждением отладчика 'PInvokeStackImbalance'.

в объявленной библиотечной функции

extern "C"  _declspec(dllexport)
int __stdcall GetLine(HWND hwnd, int iLine, TCHAR *buff)

Добавление файла export.def в проект dll

EXPORT
  GetLine

и в компоновщик Дополнительные параметры

/DEF:"exports.def"

проблема решена

0 голосов
/ 06 марта 2012

У вас есть 2 способа создания DLL.

Один из них - получение адресов функций (старый способ), а второй - по параметрам и имени («новый» способ, используемый, например, в .net).

Я полагаю, вы не используете свою C ++ dll правильно

Возможно, вам следует использовать GetProcAddress GetProcAddress Msdn

Вот некоторая документация относительно Экспорт Dll , который может пригодиться

...