我正在实现一个需要读写串口数据的C++ DLL。该DLL被用于一个C#应用程序中。目前,当我使用C++的读取代码时,无法从C#应用程序中读取数据(没有C#包装器时,读取函数可以正常工作)。
C++代码:
extern "C" __declspec(dllexport) int Read(void *Buffer, unsigned int MaxNbBytes, unsigned int TimeOut_ms)
{
return uart.Read(Buffer, MaxNbBytes, TimeOut_ms);
}
C# 代码
[DllImport("RS232LIB.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int Read(out byte[] bytesRead, int maxNbBytes, int timeOutMs);
var bytes = new byte[4];
Read(out bytes, 4, 10);
在运行这些代码后,我一直收到“System.AccessViolationException”异常。该如何解决这个问题?
备注:我不能使用C# Serial类。我的C++串行函数工作正常。
“uart.Read(void *Buffer, unsigned int MaxNbBytes, unsigned int TimeOut_ms)”参考:
\Buffer:从串行设备读取的字节数组 \MaxNbBytes:允许读取的最大字节数 \TimeOut_ms:在放弃读取之前的超时延迟
out
。将 bytes.Length 作为第二个参数传递,这样你就永远不会出错。而且不要忽略返回值,它可能告诉你它复制了多少字节到你的数组中。 - Hans Passantuint
签名更改为int
并删除了out
。没有异常,但是我从该行获取到垃圾数据。 - gr1d3r