c#呼叫C++DLL EntryPointNotFoundException 找不到入口點

無名_四葉草發表於2020-04-04

c#程式呼叫C++的dll的時候,經常出現這樣的問題:

System.EntryPointNotFoundException:Unable to find an entry point 

程式碼: 

[DllImport("LibUsb.dll", EntryPoint = "USB_lib_Open", CharSet = CharSet.Unicode)]
internal static extern Int16 USB_lib_Open(ref USBLibCom.LIB_INFO libInfo, Int16 Id);
// 呼叫
Int16 retVal = USB_lib_Open(ref libInfo, 0);


查詢了以下資料,結果找到了原因。

原因就是:c++原始碼中的函式在編譯成DLL後,函式的名稱就發生了改變:會在函式的前後產生一些字元。所以找不到方法的入口點。

 

我們能通過eXeScope軟體來檢視c++編譯後的函式名稱是什麼。

例子:原方法名USB_lib_Open,編譯後:?USB_lib_Open@@YGHPAUst_SCAMv3_LIB_INFO@@H@Z

修改後:

[DllImport("LibUsb.dll", EntryPoint = "?USB_lib_Open@@YGHPAUst_SCAMv3_LIB_INFO@@H@Z", CharSet = CharSet.Unicode)]
internal static extern Int16 USB_lib_Open(ref USBLibCom.LIB_INFO libInfo, Int16 Id);
// 呼叫
Int16 retVal = USB_lib_Open(ref libInfo, 0);


 

呼叫正常。

相關文章