Исключение точки входа не найдено - PullRequest
14 голосов
/ 18 августа 2010

Я пытаюсь использовать неуправляемую dll на C ++ в проекте C # и получаю сообщение об ошибке при попытке вызвать функцию, которая сообщает, что точка входа не найдена.

public class Program
{

    static void Main(string[] args)
    {
        IntPtr testIntPtr = aaeonAPIOpen(0);            
        Console.WriteLine(testIntPtr.ToString());
    }

    [DllImport("aonAPI.dll")]
    public static extern unsafe IntPtr aaeonAPIOpen(uint reserved);
}

Вот свалка для функции:

5    4 00001020 ?aaeonAPIOpen@@YAPAXK@Z

Я изменил импорт dll на [DllImport("aonAPI.dll", EntryPoint="?aaeonAPIOpen")] и [DllImport("aonAPI.dll", EntryPoint="_aaeonAPIOpen")] и не повезло.

Ответы [ 2 ]

16 голосов
/ 18 августа 2010

Используя утилиту undname.exe, этот символ переводится в

 void * __cdecl aaeonAPIOpen(unsigned long)

, что делает правильное объявление:

    [DllImport("aonAPI.dll", EntryPoint="?aaeonAPIOpen@@YAPAXK@Z", 
        ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
    public static extern IntPtr aaeonAPIOpen(uint reserved);
9 голосов
/ 18 августа 2010

Похоже, что функция, которую вы пытаетесь вызвать, скомпилирована как функция C ++ и, следовательно, имеет искаженное имя.PInvoke не поддерживает искаженное имя.Вам нужно добавить внешний блок "C" вокруг определения функции, чтобы предотвратить искажение имени

extern "C" {
  void* aaeonAPIOpen(uint reserved);
}
...