我正在Windows(7/8/10)下使用Silicon Labs VCP(CP2105),并且我试图使用Silicon Labs运行时DLL从中获取一些信息-该DLL是不受管理的。
这是我的实现方式
[DllImport("CP210xRuntime.dll")]
private static extern Int32 CP210xRT_GetDeviceProductString(IntPtr handle, IntPtr bfPtr, ref uint len, bool convert);
public static Int32 GetProduct(IntPtr handle)
{
var buff = new char[100];
GCHandle hnd = GCHandle.Alloc(buff);
IntPtr bfPtr = (IntPtr)hnd;
uint bytesRead = 0;
var r = CP210xRT_GetDeviceProductString(handle, bfPtr, ref bytesRead, true);
hnd.Free();
return r;
}
我正在使用以下命令获取端口的设备句柄:
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr CreateFile(
string FileName,
uint DesiredAccess,
uint ShareMode,
IntPtr SecurityAttributes,
uint CreationDisposition,
uint FlagsAndAttributes,
IntPtr hTemplateFile
);
当我运行它时,它可以正常工作-就是说,返回值是0,根据Silicon Labs文档,这表明一切都很好,我已经通过使用其他设备的句柄确认了这一点,我拿回3,这确认无效的句柄。
bytesRead ref值也按预期修改为36,这是产品名称的长度。但是buff数组永远不会填充任何数据(只是为了确保我也已将值写入每个元素,但它们不会改变)。如果我让程序继续运行,整个过程将引发异常:
托管调试助手“ FatalExecutionEngineError”在********中检测到问题
其他信息:运行时遇到致命错误。错误的地址位于线程0x1f5c上的0x70338780。错误代码为0xc0000005。此错误可能是CLR或用户代码中不安全或不可验证部分的错误。该错误的常见来源包括COM-interop或PInvoke的用户封送处理错误,这些错误可能会破坏堆栈。
如果我注释掉了我从dll调用函数的行,则程序也这样做-程序不会失败。
我不太熟悉使用C#调用未管理的代码,因此,如果有人可以帮助我找出我要去的地方/向正确的方向指出,我将不胜感激!
这是来自Silicon Labs文档:
CP210x_STATUS CP210xRT_GetDeviceProductString(HANDLE cyHandle,
LPVOID lpProduct, LPBYTE lpbLength, BOOL bConvertToASCII = TRUE)