我終於有了一個完整的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嘗試,並有相同的結果。我非常接近完成這個項目的過程,我一直在這裏工作,希望這是我的最後一件事。
謝謝。
我看到你ntion「CComms.dll」,但DllImport屬性似乎在尋找「VLTGLSCommsDLL.dll」。那是什麼錯誤? – Ani 2012-03-06 16:44:55
「這些函數都是用C++導出的,就像這樣」您可以嘗試在出口聲明中添加'extern「C」'來獲得通常的'__stdcall'導出名稱?如果.NET不能導入這兩種類型,我會感到驚訝。 – Rup 2012-03-06 16:46:57
對不起,我應該已經解釋過,所有導出的函數都封裝在一個extern「C」塊中,我只是將這裏的一個函數作爲示例展示出來,至於我最近對這個DLL名稱進行了更改在輸入這些信息時,新老混淆了,它正在尋找正確的DLL並找到它,否則它會拋出DLLNotFoundException異常。對代碼進行了更改,以便它在所有位置都具有正確的DLL名稱。 – 2012-03-06 16:48:48