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

  • Post author:
  • Post category:其他



背景

在使用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


问题描述:



尝试读取或写入受保护的内存



原因及解决方案:



该片内存可能正在读写,获取返回信息时,添加延时就没有出现该问题了



版权声明:本文为weixin_42183571原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。