问题:

在使用C#的DllImport调用C++编写的类库dll时候,出现找不到函数入口点。

C++的dll函数名

#ifdef DLLCLASS_EXPORT
#define EXT_CLASS __declspec(dllexport)
#else
#define EXT_CLASS _declspec(dllimport)
#endifextern "C"  EXT_CLASS class  CBaseInterface
{
public:virtual int SetParameter(unsigned char ucIPAddr[4], unsigned short usPort) = 0;virtual int OpenBoard() = 0;virtual int CloseBoard() = 0;virtual int ReadRegisterUlong(unsigned int uiOffset, unsigned int* puiData) = 0;virtual int WriteRegisterUlong(unsigned int uiOffset, unsigned int uiData) = 0;
};

我C#调用:

[DllImport(@"SignalProbeDevice.dll", EntryPoint = "CDeviceInterface")]static extern int OpenBoard();

找了很久,觉得没有问题,使用VS自带的工具dumpbin.exe查看一下,封装的dll的函数的名称。

dumpbin.exe在VS安装目录下,我安装的是Visual Studio 2019 Community版本,我的路径参考如下:

D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx64\x64

如何使用dumpbin.exe查看封装好的dll的函数名:

有同学反映使用dumpbin.exe会闪退,是因为不能直接点开输入指令,而是应该从系统cmd启动。

方法如下:

然后输入指令:

dumpbin -exports (dll的路径)

如:

结果:

此时发现了问题,我的函数名OpenBoard变成了?OpenBoard@NETBInterface@@UEAAHXZ,

解决:

我改了函数入口,重新调用,即OK:

[DllImport(@"SignalProbeDevice.dll", EntryPoint = "?OpenBoard@NETBInterface@@UEAAHXZ")]static extern int OpenBoard();

以上方法,修改了C#调用的EntryPoint,实现了正常调用。

为什么会出现函数名被篡改,如何避免?

参考文章:c#调用C++的DLL找不到入口点以及衍生的相关问题_缘梦逍遥的博客-CSDN博客

C#调用C++类库dll,无法找到函数入口(无法在“***.dll“中找到名为“***“的入口点)相关推荐

  1. C和指针之高级指针话题通过函数指针实现在链表中找到特定的值

    1.问题 通过函数指针实现在链表中找到特定的值,这里可以是int 类型或者char *类型 思路:      整形数据自己写比较函数,字符串比较用strcmp,然后把这个函数指针传递到函数作为参数. ...

  2. java主程序怎样调用子程序_存过和函数以及在Java程序中的调用

    存储过程,函数都是数据库的对象. 创建和调用 存储在数据库中的子程序,是由plsql语言写的,完成特定功能的程序. 函数可以返回值,存过不能返回值.除此之外,一致. create procedure ...

  3. c语言中未找到函数入口,C语言的入口函数不一定叫main

    原标题:C语言的入口函数不一定叫main C语言的入口程序好像都被固定好了叫"main"但是不一定哦. 先写个程序:#include #include int main() { p ...

  4. python的matplotlib库内的函数_如何在matplotlib中找到函数下面的区域?

    我是python和matplotlib库的新手,我试图在绘图中得到函数行下方的区域.我有一个变量a&amp:b,它在我的绘图中移动一个矩形.我也许可以使用原始数学来解决这个问题,但我想知道是否 ...

  5. 在函数“DECFLOAT”的字符串变量中找到无效字符

    新同事遇到个问题,我想着写出来给遇到相同问题的人一个思路 select col1 from table1 where col1<100 错误原因是col1是字符串类型的,与数字比较要转换类型,而 ...

  6. C#调用dll报错:无法加载dll,找不到指定模块

    最近在做一个swmm模型的项目,在swmm源码上进行改写了两个函数,结果调用的时候就报错了,C#报错之说找不到指定模块,就是不说具体问题,在网上排查了很久,在这里记录一下. 如果确定自己的dll函数 ...

  7. 【Flutter】Dart 技巧 ( 独立主函数入口 | 可空类型判定 | 默认值设定 )

    文章目录 一.独立主函数入口 二.可空类型判定 三.默认值设定 四.完整代码示例 五. 相关资源 一.独立主函数入口 在 dart 文件中声明 main() 函数 , 即可脱离 Flutter 环境 ...

  8. C语言求在算术级数中找到缺少的数字(附完整源码)

    C语言求在算术级数中找到缺少的数字 在算术级数中找到缺少的数字 C语言求在算术级数中找到缺少的数字完整源码(定义,实现,main函数测试) 在算术级数中找到缺少的数字 Examples: Input: ...

  9. 如何在 R 中找到 F 临界值

    当您进行 F 检验时,您将获得 F 统计量作为结果.要确定 F 检验的结果是否具有统计显着性,可以将 F 统计量与 F 临界值进行比较.如果 F 统计量大于 F 临界值,则检验结果具有统计显着性. F ...

  10. Java笔记-通过放射获取类中成员名及调用get方法及map构造JSON数据

    目录 通过反射获取类中成员名 通过反射调用get方法 map生成JSON数据 通过反射获取类中成员名 /*** 获取类中的所有成员名* @param currentClass* @return* @t ...

最新文章

  1. [Usaco2005 Open]Disease Manangement 疾病管理 BZOJ1688
  2. 基础10 多进程、协程(multiprocessing、greenlet、gevent、gevent.monkey、select、selector)...
  3. document.body.scrollTop以及一些备忘
  4. 通过bios修改服务器ipmi配置,Dell服务器之配置ipmi远程console管理
  5. android service交互,Android Activity与Service的交互方式
  6. spring拦截器-过滤器的区别
  7. Dubbo源码分析系列之-深入Dubbo扩展机制
  8. BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
  9. 动态调试 ida linux,IDA动态调试-ELF
  10. tensorflow之variables_to_restore
  11. 【IDE-Visual Studio】无法启动程序“xxx.exe”。由于应用程序配置不正确,未能启动此应用程序。
  12. 洛谷-P1007-魔法少女
  13. regularization 正则化
  14. iOS10新特性——————陈Hong鑫
  15. 百度地图,你学会了吗
  16. mysql注入大全_mysql注入大全及防御
  17. 两子公司犯单位行贿罪各罚100万 鹏博士收警示函高度重视
  18. 【Android -- 开源库】DanmakuFlameMaster 的基本使用
  19. svn 一次性提交整个目录包括子目录
  20. AVR系列单片机的基本架构(翻译自俄语讲义)

热门文章

  1. 基于SSM+VUE的交通事故案例库系统(前后端分离)
  2. 文科女生转行软件测试之路
  3. 计算机网络里ping是什么意思,Ping命令有什么作用,Ping通后显示的数据是什么意思?...
  4. 信用卡积分兑换里程全攻略
  5. SVN不能Cleanup的几种解决办法
  6. Layui 后台管理模板 【Y-Admin】
  7. python 微信公众号接口之上传图片素材
  8. HTML入门笔记8-上脚注和下脚注标签
  9. 你在项目中做过哪些安全防范措施?
  10. 云流化/云渲染技术一种比像素流功能更完善的解决方案