通过C#

时间:2018-11-13 14:52:55

标签: c#

我正在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)

0 个答案:

没有答案