背景
在使用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
问题描述:
尝试读取或写入受保护的内存
原因及解决方案:
该片内存可能正在读写,获取返回信息时,添加延时就没有出现该问题了