"无法在dll中找到名为[function]的入口点"(c ++到c#类型转换)

Evg*_*eny 21 c# c++ dll dllimport extern

我有一个来自第三方的dll,它是用C++编写的.以下是来自dll文档的一些信息:

//start documentation

RECO_DATA{
wchar_t Surname[200];
wchar_t Firstname[200];
}
Run Code Online (Sandbox Code Playgroud)

描述:用于接收功能结果的数据结构.所有功能结果将存储为Unicode(UTF-8).

方法:

bool recoCHN_P_Name(char *imgPath,RECO_DATA *o_data);
Run Code Online (Sandbox Code Playgroud)

输入:

char * imgPath
Run Code Online (Sandbox Code Playgroud)

此功能识别的图像位置的完整路径

RECO_DATA * o_data
Run Code Online (Sandbox Code Playgroud)

用于接收功能结果的数据对象.函数返回:如果成功则返回true,否则返回false.

//end documentation
Run Code Online (Sandbox Code Playgroud)

我试图从我的C#应用​​程序调用recoCHN_P_Name.为此,我想出了这段代码:

导入dll的代码:

    public class cnOCRsdk
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct RECO_DATA{
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=200)]
        public string FirstName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
        public string Surname;
        }

    [DllImport(@"cnOCRsdk.dll", EntryPoint="recoCHN_P_Name")]
    public static extern bool recoCHN_P_Name(byte[] imgPath, RECO_DATA o_data);
}
Run Code Online (Sandbox Code Playgroud)

调用函数的代码:

            cnOCRsdk.RECO_DATA recoData = new cnOCRsdk.RECO_DATA();

        string path = @"C:\WINDOWS\twain_32\twainrgb.bmp";

        System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
        byte[] bytes = encoding.GetBytes(path);

        bool res = cnOCRsdk.recoCHN_P_Name(bytes, recoData);
Run Code Online (Sandbox Code Playgroud)

我得到的错误是""无法在DLL"cnOCRsdk.dll"中找到名为"recoCHN_P_Name"的入口点."我怀疑我在将类型从C++转换为C#时遇到错误.但是究竟......?

i_a*_*orf 33

首先确保实际导出该函数:

在Visual Studio命令提示符中,使用 dumpbin /exports whatever.dll

  • 有关如何解密的详细说明,请访问http://www.kegel.com/mangle.html.确保您的数据类型正确无误. (3认同)

pax*_*blo 23

C#不支持C++名称修改,你需要声明C++函数

extern "C" {...}
Run Code Online (Sandbox Code Playgroud)

(如果他们来自第三方,可能不是一个选项),或者如果你可以让它工作,可以直接调用受损的名字.让第三方提供功能的非破坏接口可能更容易.

  • 您的回答挽救了我的生命。 (2认同)

Evg*_*eny 17

解决了 - 至少到程序没有破坏的程度,实际上给我一个bool值.

我想,关键是将入口点指定为"受损"名称

    [DllImport(@"cnOCRsdk.dll", EntryPoint="?recoCHN_P_Name@CcnOCRsdk@@QAE_NPADPAURECO_DATA@@@Z")]
    public static extern bool recoCHN_P_Name(ref string imgPath, ref RECO_DATA o_data);
Run Code Online (Sandbox Code Playgroud)

之后我得到了一些其他错误,但"无法找到切入点"消失了.


Ham*_*mid 6

我在这些步骤中解决了同样的问题:

步骤 1)如果您使用 Visual Studio 在 C++ 中编写自定义 DLL,则在项目的属性页将Common Language Runtime Support (/clr)参数设置为Common Language Runtime Support (/clr).

步骤 2)要在.h文件中使用减速功能,请使用__declspec(dllexport)如下关键字:

__declspec(dllexport) double Sum(int a,int b);
Run Code Online (Sandbox Code Playgroud)

步骤 3)构建并导出 DLL 文件,然后使用Dependency Walker软件获取您的函数EntryPoint

step4)在 C# 项目中导入 DLL 文件并设置EntryPointCallingConvention变量,如下所示:

[DllImport("custom.dll", EntryPoint = "?Sum@@YAXHHHHHHNNN@Z", CallingConvention = CallingConvention.Cdecl)]

    public static extern double Sum(int a,int b);
Run Code Online (Sandbox Code Playgroud)