2010-08-18 5 views
12

Я пытаюсь использовать неуправляемую 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); 
} 

Вот DUMPBIN для функции:

5 4 00001020 [email protected]@[email protected] 

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

ответ

14

Используя undname.exe утилиту, что символ demangles к

void * __cdecl aaeonAPIOpen(unsigned long) 

Что делает правильное заявление:

[DllImport("aonAPI.dll", EntryPoint="[email protected]@[email protected]", 
     ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)] 
    public static extern IntPtr aaeonAPIOpen(uint reserved); 
+0

+1, не понимал, что вы можете это сделать. Насколько безопасен этот подход? Изменено ли измененное имя из сборки для сборки или оно согласовано между сборками одного и того же кода? – JaredPar

+0

@ Jared: манипуляция основана исключительно на объявлении функции C++. Вот почему undname.exe может работать. Он стабилен до тех пор, пока декларация не изменится. Это делает его более безопасным *, чем внешняя декларация «C». –

9

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

extern "C" { 
    void* aaeonAPIOpen(uint reserved); 
} 
Смежные вопросы