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

时间:2024-03-24 18:16:39

背景

在使用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工具转换

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

  [DllImport("LibFT260.dll", EntryPoint = "[email protected]", CallingConvention = CallingConvention.Cdecl)]

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

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

问题3

 

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

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