2010-08-18 18 views
12

Estoy tratando de usar un dll no administrado de C++ en un proyecto de C# y me aparece un error al intentar llamar a una función que dice que no se puede encontrar el punto de entrada.No se encuentra el punto de entrada Excepción

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

Aquí es el dumpbin para la función:

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

me cambió la importación DLL para [DllImport("aonAPI.dll", EntryPoint="?aaeonAPIOpen")] y [DllImport("aonAPI.dll", EntryPoint="_aaeonAPIOpen")] y sin suerte.

Respuesta

14

Uso de la utilidad undname.exe, ese símbolo demangling a

void * __cdecl aaeonAPIOpen(unsigned long) 

que efectúe la declaración apropiada:

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

+1, no se dio cuenta de que podía hacer eso. ¿Qué tan seguro es este enfoque? ¿El nombre destruido cambia de una generación a otra o es consistente en las construcciones del mismo código? – JaredPar

+0

@Jared: el cambio se basa puramente en la declaración de la función C++. Por eso undname.exe puede funcionar. Es estable siempre y cuando la declaración no cambie. Esto lo hace * más seguro * que una declaración "C" externa. –

9

Parece que la función que está tratando de llamar está compilada como una función de C++ y, por lo tanto, tiene su nombre mutilado. PInvoke no admite nombres dañados. Es necesario añadir un bloque extern "C" en torno a la definición de la función de prevenir nombre mangling

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