2012-12-03 46 views
1

我有一個C函數,這是一個VS 2010項目的組成部分,這個簽名:調用C函數使用P/Invoke

real_T wrapper(void) 

其中

typedef double real_T; 

在我的C#代碼我嘗試這樣的:

[DllImport(@"C:\Users\bla\Documents\Visual Studio 2010\Projects\bla\bla\Debug\bladibla.dll")] 
public static extern double wrapper(); 

static void Main(string[] args) 
{ 
    wrapper(); 
} 

,但得到:

無法在DLL'C:\ Users \ bla \ Documents \ Visual Studio 2010 \ Projects \ bla \ bla \ Debug \ bladibla.dll'中找到名爲'wrapper'的入口點。

該DLL肯定是存在的。還有什麼可能是錯的?

+0

您是否使用'__declspec(dllexport)'導出了dll的方法? – Rotem

+0

我不這麼認爲 - 你能否提供一個鏈接? – cs0815

+0

看到@David回答 – Rotem

回答

3

可能該函數正在以一個錯位的名稱導出。你可以像這樣抑制這種變形:

extern "C" { 
    real_T wrapper(void); 
} 

你不明顯在導出函數。最簡單的方法來做到這一點是這樣的:

extern "C" { 
    __declspec(dllexport) real_T wrapper(void); 
} 

如果仍然不能解決缺少的匯出,請使用類似的Dependency Walker工具來檢查功能是否實際上被出口,如果是在什麼樣的名稱。

最後,您應該將C#端的調用約定聲明爲cdecl以匹配您的本機函數的調用約定。

[DllImport(@"...", CallingConvention=CallingConvention.Cdecl)] 
public static extern double wrapper(); 
+0

非常好 - 謝謝! – cs0815