当前位置: 首页 > 编程语言 > C#

《Cannotfindentrypointnamedindll》(c++到c#类型转换)分享

时间:2023-04-10 13:40:42 C#

《Cannotfindentrypointnamedindll》(c++toc#类型转换)我有一个第三方的dll是用C++编写。以下是dll文档中的一些信息://startdocumentationRECO_DATA{wchar_tSurname[200];wchar_t名字[200];}描述:用于接收函数结果的数据结构。所有函数结果都将存储为Unicode(UTF-8)。方法:boolrecoCHN_P_Name(char*imgPath,RECO_DATA*o_data);输入:char*imgPath此函数识别的图像位置的完整路径RECO_DATA*o_data用于接收函数结果的数据对象。函数返回:如果成功则返回true,否则返回false。//enddocumentation我正在尝试从我的C#应用程序调用recoCHN_P_Name。为此,我想出了以下代码:导入dll的代码:publicclasscnOCRsdk{[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]publicstructRECO_DATA{[MarshalAs(UnmanagedType.ByValTStr,SizeConst=200)]公共字符串名字;[MarshalAs(UnmanagedType.ByValTStr,SizeConst=200)]publicstring姓氏;}[DllImport(@"cnOCRsdk.dll",EntryPoint="recoCHN_P_Name")]publicstaticexternboolrecoCHN_P_Name(byte[]imgPath,RECO_DATAo_data);}调用函数代码:cnOCRsdk.RECO_DATArecoData=newcnOCRsdk.RECO_DATA();字符串路径=@"C:WINDOWStwain_32twainrgb.bmp";System.Text.ASCIIEncoding编码=newSystem.Text.ASCIIEncoding();byte[]bytes=encoding.GetBytes(path);boolres=cnOCRsdk.recoCHN_P_Name(bytes,recoData);我收到的错误是“在DLL'cnOCRsdk.dll'中找不到名为'recoCHN_P_Name'的入口点。”“我怀疑我在将类型从C++转换为C#时出错。但究竟是什么……?首先确保该函数确实被导出:在VisualStudio命令提示符中,使用dumpbin/exportswhatever.dllC#不支持C++名称修改,您需要声明C++函数extern"C"{...}(如果它们来自第三方,可能不是一个选项),或者如果你可以让它工作,直接调用损坏的名称。让第三方为函数提供一个不间断的接口可能会更容易。已解决-至少到了程序不会中断并且实际上给了我一个bool值的地步。我猜,关键是将入口点指定为“损坏的”名称(参考字符串imgPath,参考RECO_DATAo_data);之后我得到了一些其他错误,但“无法找到入口点”消失了。我用C++/CLI写了一个包装器。此包装器将能够包含.h文件并链接到您从第三方供应商处获得的.lib文件。这样就可以轻松安全地为C#程序编写托管接口。我在这些步骤中解决了同样的问题:步骤1)如果使用VisualStudio在C++中编写自定义DLL,请在项目支持(/clr)的属性页中将公共语言运行时支持(/clr)参数设置为公共语言运行时).步骤2)要在.h文件中使用减速功能,请使用__declspec(dllexport)关键字,如下所示:__declspec(dllexport)doubleSum(inta,intb);步骤3)构建并导出DLL文件,然后使用DependencyWalker软件获取您的函数EntryPoint。step4)导入DLL文件,在C#工程中设置EntryPoint和CallingConvention变量如下:外部双总和(inta,intb);在DllImport中指定CallingConvention时,您可以尝试使用未编码的名称。正确的EntryPoint字符串可以在主要非托管dll附带的“.lib”文件中找到。以上就是C#学习教程:《Unabletofindtheentrypointnamedinthedll》(c++到c#类型转换)分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关照——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: