c#呼び出しC++DLL EntryPointNotFoundExceptionエントリポイントが見つかりません
951 ワード
c#プログラムがC++のdllを呼び出すと、このような問題がよく発生します.
コード:
以下の資料を調べた結果、原因が見つかりました.
なぜなら、c++ソースコードの関数がDLLにコンパイルされると、関数の名前が変わります.関数の前後に文字が生成されます.だから方法の入り口が見つからない.
eXeScopeソフトウェアを使用して、c++コンパイル後の関数名を表示できます.
例:原方法名USB_lib_Open,コンパイル後:?USB_lib_Open@@YGHPAUst_SCAMv3_LIB_INFO@@H@Z
変更後:
呼び出しは正常です.
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);
呼び出しは正常です.