C#调用C++dll中的函数,显示无法找到入口点

北斗星空 2018-12-28 08:24:03


[DllImport(@"F:\Hw\ConsoleApplication1\ConsoleApplication1\Location.dll", EntryPoint = "LocateBlob", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]

public static extern int LocateBlob(string imgbuf, int width, int height, out float imgpara, out float deltax, out float deltay);




“System.EntryPointNotFoundException”类型的未经处理的异常在 ConsoleApplication1.exe 中发生

其他信息: 无法在 DLL“F:\Hw\ConsoleApplication1\ConsoleApplication1\Location.dll”中找到名为“LocateBlob”的入口点。
...全文
1436 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hez2010 2019-01-01
  • 打赏
  • 举报
回复
C++的dll编译出来的导出函数名并不是你定义的名字,还会加上调用方式、链接信息等等,所以不能直接通过函数名进行调用,例如“public: void __thiscall ShareInterface::Init(void)" (?Init@ShareInterface@@QAEXXZ)”。
如果想要调用的话请使用dll查看器查看他的Origin,通过这个东西进行调用(需要在前面加一个#),比如,EntryPoint = "#1"
Saleayas 2018-12-30
  • 打赏
  • 举报
回复
看错误,首先可以确定 .dll 文件是存在的,只是入口点找不到。 很大程度上是因为名字碾平的问题。 仔细查看一下导出的符号名字。
threenewbee 2018-12-29
  • 打赏
  • 举报
回复
如果导出表、函数名都检查没问题,那么可能你的.net程序是64bit的,无法调用32bit dll
北斗星空 2018-12-29
  • 打赏
  • 举报
回复
C++ dll 不是我写的能否提供下协助。谢谢 QQ 837925598
gd6321374 2018-12-29
  • 打赏
  • 举报
回复

给个列子给你,下面是我写C+ 和 C# ,你可以参考下:

c++ 函数声明 使用__stdcall调用约定

//60、Defire高阶创文件
ReaderDLL int CallReader DesfireHLCreateFile(
UCHAR addr, //设备地址
UCHAR cid, //通道号, 一般为0x01
int AID, //子应用编号
UCHAR keyNo, //子应用主密钥编号 一般为0
UCHAR keyType, //子应用主密钥类型
UCHAR *keyData, //子应用主密钥数据
UCHAR fileID, //文件ID
UCHAR fileType, //文件类型
UCHAR commType, //文件的通讯方式 0: Plain; 1: MACing; 3: Full Enciphered;
UCHAR keyNoFile1, //更改文件的密钥KeyNO 和 读写文件KeyNo。
UCHAR keyNoFile2, //文件类型 写文件KeyNo, 读文件KeyNo
unsigned int fileSpace, //文件大小
unsigned int minValue, //最小值,4字节的整数,不能为负.
unsigned int maxValue, //最大值,4字节的整数
unsigned int initValue, //初始值
UCHAR creditFlag, //是否使用信用标志 0 不使用 1 使用
unsigned int oneRecordLen, //一个记录的大小,4字节的整数
unsigned int maxRecordNum); //最大记录数


C# 调用

//64、Defire高阶创文件
[DllImport("ICReader.dll", EntryPoint = "DesfireHLCreateFile", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int DesfireHLCreateFile(
byte addr, //设备地址
byte cid, //通道号, 一般为0x01
int AID, //子应用编号
byte keyNo, //子应用主密钥编号 一般为0
byte keyType, //子应用主密钥类型
ref byte keyData, //子应用主密钥数据
byte fileID, //文件ID
byte fileType, //文件类型
byte commType, //文件的通讯方式 0: Plain; 1: MACing; 3: Full Enciphered;
byte keyNoFile1, //更改文件的密钥KeyNO 和 读写文件KeyNo。
byte keyNoFile2, //文件类型 写文件KeyNo, 读文件KeyNo
UInt32 fileSpace, //文件大小
UInt32 minValue, //最小值,4字节的整数,不能为负.
UInt32 maxValue, //最大值,4字节的整数
UInt32 initValue, //初始值
byte creditFlag, //是否使用信用标志 0 不使用 1 使用
UInt32 oneRecordLen, //一个记录的大小,4字节的整数
UInt32 maxRecordNum); //最大记录数


平底锅锅锅 2018-12-28
  • 打赏
  • 举报
回复
dll引用的对不对,路径,名称。函数名及变量声明的对不对。dll和编译环境和现在项目的编译环境是否一致。
平底锅锅锅 2018-12-28
  • 打赏
  • 举报
回复
xian_wwq 2018-12-28
  • 打赏
  • 举报
回复
1.如果是c++的,使用Depends查下函数名称
P/Invoke调用,只好是调用c类型的,
如果是c++的,有可能会更改函数名称,
更详细说明网搜 extern "C"的说明

2.把c++ dll的函数定义贴出来
指针类型的,用ref来对应。
平底锅锅锅 2018-12-28
  • 打赏
  • 举报
回复
dll里面的函数出问题。检查一下生成dll和使用dll 的系统环境或者编译环境。
参考:https://blog.csdn.net/C_gyl/article/details/85325469
stherix 2018-12-28
  • 打赏
  • 举报
回复
c++代码是你写的吗 最好用def文件定义下导出 不然函数名字和你代码里的可能不同 比如加些_啊数字啊之类的
北斗星空 2018-12-28
  • 打赏
  • 举报
回复
int LocateBlob(char *imgbuf, int width, int height, float imgpara, float &deltax, float &deltay) 这是C++的dll

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧