Вызов DLL с использованием C # - PullRequest
0 голосов
/ 21 мая 2011
typedef struct
{
    // The contents of this struct are platform-dependent and subject to
    // change. You should not manipulate the contents of this struct directly.

    /*New stuff*/
//  HWND            m_hWnd;
//  HDEVNOTIFY      m_hDevNotify;

} fdGlove;


FGLOVEAPI fdGlove *fdOpen(char *pPort, bool bOnlyAllowSingleConnection = false);    
FGLOVEAPI int   fdClose(fdGlove *pFG);
FGLOVEAPI int   fdGetGloveHand(fdGlove *pFG);
FGLOVEAPI int   fdGetGloveType(fdGlove *pFG);

У меня есть файл DLL с именем fglove.dll, и мне нужно использовать C # для его вызова. Я написал код, подобный этому:

    [StructLayout(LayoutKind.Sequential)]
    public class fdGlove
    { 

    }
    [DllImport("fglove.dll")]
    public static extern fdGlove fdOpen(string pPort, bool bOnlyAllowSingleConnection);

но при отладке программы возникает ошибка (не удается найти точку входа с именем 'fdOpen' в DLL 'fglove.dll'.)

Может кто-нибудь указать, что я сделал неправильно?

Ответы [ 3 ]

3 голосов
/ 21 мая 2011

fdOpen использует параметр по умолчанию - это может означать только то, что вы пытаетесь экспортировать функцию C ++ из DLL.В результате "fdOpen" получает "искаженное имя" в таблице экспорта как нечто, похожее на "fdOpen @ YAXPB_W0I @ Z".

Вам лучше экспортировать эту функцию как C. Объявите и определитеfdOpen следующим образом:

extern "C" fdGlove* __stdcall fdOpen(char* pPort, bool bOnlyAllowSingleConnection);

Другие возможные проблемы:

  1. DLL не находится в том же каталоге, что и EXE-файл, пытающийся ее загрузить.

  2. Вы забыли экспортировать функцию из DLL.Вам нужно использовать файл .DEF или атрибут __declspec (dllexport) в определении функции.Используйте «dumpbin / exports fglove.dll», чтобы выяснить, так ли это.

  3. Путаница между опциями компиляции stdcall и cdecl.Я запутался, поэтому попробуйте заменить "_ stdcall" на " _cdecl" выше.Или попробуйте без какого-либо атрибута.

1 голос
/ 21 мая 2011

Компилятор fglove, скорее всего, делает этот тип искажения имени.

Используйте DUMPBIN fglove.dll, чтобы получить настоящие имена.

Затем используйте [DllImport("fglove.dll", EntryPoint='...')], где ... - настоящее имя.

0 голосов
/ 21 мая 2011

посмотрите на имя экспортируемого символа в Dependency Walker.Скорее всего, это будет _fdImport или что-то подобное, и вам нужно будет обновить свой DLLImportAttribute, чтобы он соответствовал экспортируемому имени.

...