2010-08-18 93 views
12

我正在嘗試在C#項目中使用C++非託管dll,並且在嘗試調用一個表明無法找到入口點的函數時出現錯誤。未找到入口點例外

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到

​​

這使得適當聲明:

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

+1,沒有意識到你可以做到這一點。這種方法有多安全?損壞的名稱是從構建變爲構建還是跨構建相同的代碼是否一致? – JaredPar 2010-08-18 18:36:27

+0

@Jared:這個修改完全基於C++函數的聲明。這就是爲什麼undname.exe可以工作。只要聲明不變,它就是穩定的。這使得它比外部的「C」聲明更安全。 – 2010-08-18 18:59:20

9

它看起來像你試圖調用的函數被編譯爲一個C++函數,因此它的名稱已損壞。 PInvoke不支持錯位的名稱。您需要添加周圍的函數定義一個extern「C」塊,以防止名字改編

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