2010-08-18 8 views
12

J'essaie d'utiliser une DLL non gérée C++ dans un projet C# et j'obtiens une erreur lorsque j'essaie d'appeler une fonction indiquant que le point d'entrée est introuvable.Point d'entrée introuvable Exception

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); 
} 

Voici le dumpbin pour la fonction:

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

j'ai changé l'importation dll à [DllImport("aonAPI.dll", EntryPoint="?aaeonAPIOpen")] et [DllImport("aonAPI.dll", EntryPoint="_aaeonAPIOpen")] et pas de chance.

Répondre

14

Utilisation de l'utilitaire undname.exe, ce symbole demangles à

void * __cdecl aaeonAPIOpen(unsigned long) 

qui fait la déclaration appropriée:

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

+1, ne réalisait pas que vous pouviez le faire. Quelle est la sécurité de cette approche? Le nom modifié change-t-il de la construction à la construction ou est-il cohérent entre les versions du même code? – JaredPar

+0

@Jared: le mangling est purement basé sur la déclaration de la fonction C++. C'est pourquoi undname.exe peut fonctionner. C'est stable tant que la déclaration ne change pas. Cela le rend * plus sûr * qu'une déclaration externe "C". –

9

Il semble que la fonction que vous essayez d'appeler soit compilée en tant que fonction C++ et que son nom soit donc tronqué. PInvoke ne prend pas en charge le nom tronqué. Vous devez ajouter un extern bloc « C » autour de la définition de la fonction pour empêcher le nom mutiler

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