2010-08-18 13 views
12

C# projesinde C++ unmanaged dll kullanmaya çalışıyorum ve giriş noktasının bulunamadığını belirten bir işlevi çağırmaya çalışırken bir hata alıyorum. Giriş Noktası Bulunamadı Özel Durum

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

Ben [DllImport("aonAPI.dll", EntryPoint="?aaeonAPIOpen")] ve [DllImport("aonAPI.dll", EntryPoint="_aaeonAPIOpen")] ve hiçbir şans için dll ithalat değiştirdi: Burada
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); 
} 

fonksiyonu için dumpbin olduğunu.

cevap

14

bozma adını önlemek için fonksiyon tanımı etrafında extern "C" blok eklemek gerekir ki sembol uygun ilan etmesi

void * __cdecl aaeonAPIOpen(unsigned long) 

için demangles:

+0

+1, bunu yapabileceğini farketmediniz. Bu yaklaşım ne kadar güvenli? Mandallı ad, derlemeden inşaata mı yoksa aynı kodun yapıları boyunca tutarlı mı değişiyor? – JaredPar

+0

@Jared: Mandallama, yalnızca C++ işlevinin beyanına dayanmaktadır. Undname.exe neden bu yüzden çalışabilir. Deklarasyon değişmediği sürece kararlı. Bu, bir extern "C" bildirgesinden * daha güvenli * yapar. –

9

Aramaya çalıştığınız işlev C++ işlevi olarak derlenmiş gibi görünüyor ve bu nedenle adı dolandırılıyor. PInvoke karışık ismi desteklemiyor. Sen undname.exe programı kullanarak

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