繁体   English   中英

将C dll函数导入C#

[英]Importing C dll function to C#

这是我的第一个stackoverflow帖子。 我已经在这个问题上困扰了好几天。 我尝试将usbi2cio.dll导入C Dll到基于C#的项目中。 我浏览了网站上的大多数类似帖子,但仍然无法解决我的问题,因为我的情况可能没有多大区别。

因此,这是API和相关结构作为参数的原始定义:

LONG _stdcall DAPI_ReadI2c(HANDLE hDevInstance, I2C_TRANS * TransI2C);
typedef struct _I2C_TRANS {
    BYTE byTransType;
    BYTE bySlvDevAddr;
    WORD wMemoryAddr;
    WORD wCount;
    BYTE Data[256];
}I2C_TRANS, *PI2C_TRANS;

//In my C# code, I did the translation like this:
[StructLayoutAttribute(LayoutKind.Sequential), Serializable]
public struct I2C_TRANS
{
    public byte byTransType;
    public byte bySlvDevAddr;
    public ushort wMemoryAddr;
    public ushort wCount;
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 256, ArraySubType = UnmanagedType.I1)]
    public byte[] Data;

    public I2C_TRANS(int size)
    {
        Data = new byte[size];
        this.byTransType = 0x00;
        this.bySlvDevAddr = 0x00;
        this.wMemoryAddr = 0;
        this.wCount = 0;
    }
};

public I2C_TRANS TransI2C = new I2C_TRANS(256);
public IntPtr[] hDevice = new IntPtr[DAPI_MAX_DEVICES];
...
TransI2C.byTransType = byTransType;
TransI2C.bySlvDevAddr = bySlvDevAddr;
TransI2C.wMemoryAddr = wMemoryAddr;
TransI2C.wCount = wCount;// no larger than 64
...
if((hDevice[0] = DAPI_OpenDeviceInstance(devName, 0)) != INVALID_HANDLE_VALUE)
    //the returned lReadCnt should be equal to wCount.
    Public int lReadCnt = DAPI_ReadI2c(hDevice[0], ref TransI2C);

由于某种原因,无法很好地传递读取的I2C事务中的结构,结果该函数返回0值且没有错误(我期望wCount的值相同)。 对于其他一些类似的API和结构,它也可以很好地工作。 那么,此问题的原因可能是什么?

//Here is the P/Invoke declaration:
[DllImportAttribute("UsbI2cIo.dll", EntryPoint = "DAPI_ReadI2c", CallingConvention = CallingConvention.StdCall)]
public static extern int DAPI_ReadI2c(IntPtr hDevInstance, ref I2C_TRANS TransI2C); 

我有一个类似的问题,我通过编写自己的C库(称为Bridge)来解决此问题,该库可以处理复杂的C API,但可以公开一些可以轻松与C#接口的简单方法。

例如,在下面的方法中,我可以将字节数组传递给C代码。 从C#的角度来看,我只会处理byte,int16或int32或字节数组。

[DllImport(DLL)]
private static extern System.Int32 __SPI_Helper_Write(IntPtr lpBuffer, System.Int32 len);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM