I'm trying to invoke the I2CTransfer function below, and immediately getting a System.NotSupportedException. I suspect my marshalling is wrong, but cannot work out the problem.
Here are the C structures:
BOOL I2CTransfer(HANDLE hDev, PI2C_TRANSFER_BLOCK pI2CTransferBlock); typedef struct { I2C_PACKET *pI2CPackets; INT32 iNumPackets; } I2C_TRANSFER_BLOCK, *PI2C_TRANSFER_BLOCK; typedef struct { BYTE byAddr; BYTE byRW; PBYTE pbyBuf; WORD wLen; LPINT lpiResult; } I2C_PACKET, *PI2C_PACKET; And here are the c# structures I'm attempting:
[DllImport("i2csdk.dll", EntryPoint = "I2CTransfer")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool I2CTransfer(IntPtr hI2C,ref I2C_TRANSFER_BLOCK pI2CTransferBlock); [StructLayout(LayoutKind.Sequential)] public struct I2C_TRANSFER_BLOCK { public I2C_PACKET[] pI2CPackets; public int iNumPackets; } [StructLayout(LayoutKind.Sequential)] public struct I2C_PACKET { public byte byAddr; public byte byRW; public byte[] pbyBuf; public UInt16 wLen; public IntPtr lpiResult; } Calling code:
I2C_TRANSFER_BLOCK i2CTransferBlock = new I2C_TRANSFER_BLOCK(); I2C_PACKET packet = new I2C_PACKET(); int result; IntPtr resultPtr = IntPtr.Zero; //Populating data... byte[] pBuf = new byte[1 + pbData.Length]; pBuf[0] = (byte) ((regStart & 0x7F) << 1); Array.Copy(pbData, 0, pBuf, 1, pbData.Length); // Fill packet for register write packet.pbyBuf = pBuf; packet.wLen = (ushort) pBuf.Length; packet.byRW = NativeConstants.I2C_RW_WRITE; packet.byAddr = address; packet.lpiResult = resultPtr; // Fill transfer block i2CTransferBlock.pI2CPackets = new I2C_PACKET[] {packet}; i2CTransferBlock.iNumPackets = 1; // NotSupportedException here bool brc = I2CTransfer(port, ref i2CTransferBlock); The arrays are initialized in C# before calling the method.
I've tried adding [MarshalAs(UnmanagedType.LPArray)]
to the arrays (pI2cPackets, and pbyBuf) to no avail.
This is on Windows CE - compact framework, .NET 3.5.
Is there something obviously wrong with the above translation?
Many thanks in advance.