C#引用C++ Dll文件遇到问题总结

背景

在使用C#开发时,不可避免的需要引用C++封装的Dll库。在此过程中,遇到了一些问题,在这里做个总结。

问题及解决

问题1

问题描述:运行时遇到了错误。此错误的地址为 0x5f6996b5,在线程 0x1f68 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。

原因及解决方案:一般是C#与C++参数变量转换不正确导致的。建议搜一搜C++与C#参数变量对应关系,确认两者转换关系是否正确

案例:

 [DllImport("LibFT260.dll")]

 public static extern FT260_STATUS FT260_UART_Read(IntPtr ft260Handle, byte[] lpBuffer, UInt32 dwBufferLength, UInt32 dwBytesToRead, ref UInt32 lpdwBytesReturned);

红色字体部分C++的函数参数为LPVOID*,我之前转换为了 ref byte[] lpBuffer,导致该异常发生。

问题2

问题描述:找不到函数入口点

原因及解决方案:C++dll封装后,函数名称出现乱码。如果没有dll文件源代码,可利用 DLL Anlayzer工具转换,然后在引用时标记函数入口点EntryPoint =“工具转换的函数名称”。

案例: 

通过DLL Anlayzer工具转换

  [DllImport("LibFT260.dll", EntryPoint = "_FT260_UART_SetBaudRate@8", CallingConvention = CallingConvention.Cdecl)]

  public static extern FT260_STATUS FT260_UART_SetBaudRate(IntPtr ft260Handle, UInt64 baudRate)

将DLL  Anlayzer工具转换出的函数名称引用,直接解决此问题。

问题3

 

问题描述:尝试读取或写入受保护的内存

原因及解决方案:该片内存可能正在读写,获取返回信息时,添加延时就没有出现该问题了

 

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值