背景
在使用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 = "[email protected]", CallingConvention = CallingConvention.Cdecl)]
public static extern FT260_STATUS FT260_UART_SetBaudRate(IntPtr ft260Handle, UInt64 baudRate)
将DLL Anlayzer工具转换出的函数名称引用,直接解决此问题。
问题3
问题描述:尝试读取或写入受保护的内存
原因及解决方案:该片内存可能正在读写,获取返回信息时,添加延时就没有出现该问题了