Точка входа не найдена при импорте DLL - PullRequest
0 голосов
/ 21 сентября 2018

Пытаясь использовать стороннюю нативную DLL из C #, я получаю исключение, что точка входа DLL не была найдена, и я понятия не имею, в чем причина.

dumpbin /exports дает мнеследующий символ: ?Foo@@YA_NPBDII0II_NMEEE01PAE@Z.Я решил это с помощью undname, который возвращает: bool __cdecl Foo(char const *,unsigned int,unsigned int,char const *,unsigned int,unsigned int,bool,float,unsigned char,unsigned char, unsigned char,char const *,bool,unsigned char*)

Поэтому я попытался импортировать функцию следующим образом:

[DllImport("FooDll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] // evtl. __thiscall?, Charset?
    private static extern bool Foo(string name, uint x, uint y, string app, uint width, uint height, bool switch, double factor,
        byte r1, byte g1, byte b1, string store, bool switchBack, [In, Out] byte[] result);

Я также попытался с CallingConvention = CallingConvention.ThisCall и без кодировкипараметр, но возникает то же исключение.

Есть идеи, где искать?

1 Ответ

0 голосов
/ 21 сентября 2018

Благодаря помощи Wiktor и Hans проблема с точкой входа была решена:

Необходимо было указать точку входа в качестве параметра для атрибута DllImport с искаженным / декорированным именем в качествекажется, что DLL не использует объявление extern C.Кроме того, тип параметра factor должен быть float (System.Single), чтобы соответствовать ожидаемой длине параметра в стеке.Итак, код C # теперь выглядит так:

[DllImport("FooDll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, EntryPoint = "?Foo@@YA_NPBDII0II_NMEEE01PAE@Z")]
private static extern bool Foo(string name, uint x, uint y, string app, uint width, uint height, bool switch, float factor,
    byte r1, byte g1, byte b1, string store, bool switchBack, [In, Out] byte[] result);
...