2012-03-06 66 views
3

我終於有了一個完整的C++ DLL,但我無法從C#調用它。它肯定會找到DLL,因爲當我將它從文件夾中移除時,我會得到一個不同的異常'DLLNotFoundException'。完整的錯誤描述是「無法在DLL'CComms.dll'」中找到名爲'GetNewInstance'的入口點。該功能在C++全部出口,像這樣'System.EntryPointNotFoundException'當試圖從C#調用非託管函數時

__declspec(dllexport) DWORD __stdcall GetNewInstance(); 

,我把它從C#像這樣

[DllImport("CComms.dll")] 
private static extern uint GetNewInstance(); 
// ... and in main 
uint inst = GetNewInstance(); 

當我使用「DUMPBIN /出口CComms.dll」我得到一些奇怪的輸出,我不知道是否函數名被錯位,這就是爲什麼它不能找到一個切入點

7 6 00002FB0 [email protected]@YGKXZ = [email protected]@YGKXZ (unsigned long 
__stdcall GetNewInstance(void)) 

我用,而不是__stdcall __cdecl嘗試,並有相同的結果。我非常接近完成這個項目的過程,我一直在這裏工作,希望這是我的最後一件事。

謝謝。

+1

我看到你ntion「CComms.dll」,但DllImport屬性似乎在尋找「VLTGLSCommsDLL.dll」。那是什麼錯誤? – Ani 2012-03-06 16:44:55

+1

「這些函數都是用C++導出的,就像這樣」您可以嘗試在出口聲明中添加'extern「C」'來獲得通常的'__stdcall'導出名稱?如果.NET不能導入這兩種類型,我會感到驚訝。 – Rup 2012-03-06 16:46:57

+0

對不起,我應該已經解釋過,所有導出的函數都封裝在一個extern「C」塊中,我只是將這裏的一個函數作爲示例展示出來,至於我最近對這個DLL名稱進行了更改在輸入這些信息時,新老混淆了,它正在尋找正確的DLL並找到它,否則它會拋出DLLNotFoundException異常。對代碼進行了更改,以便它在所有位置都具有正確的DLL名稱。 – 2012-03-06 16:48:48

回答

0

你有2種創建DLL的方式。

一個是通過獲取函數的地址(oldschool的方式),另一個是通過參數和名稱(「new」方式,例如.net使用)。

我想你不使用你的C++ DLL正確

也許你應該使用GetProcAddressGetProcAddress Msdn

下面是關於Dll exportation一些文件可能派上用場

0

具有與VB同樣的問題.NE 如果函數聲明沒有__stdcall但具有託管調試助理'PInvokeStackImbalance'警告,則未得到此異常。

庫中的函數

宣佈

extern "C" _declspec(dllexport) 
int __stdcall GetLine(HWND hwnd, int iLine, TCHAR *buff) 

阿迪exports.def文件的dll項目

EXPORT 
    GetLine 

和鏈接器的其它選項

/DEF:"exports.def" 

問題解決