gpt4 book ai didi

c# - 将 C dll 函数导入 C#

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:20 25 4
gpt4 key购买 nike

这是我的第一篇 stackoverflow 帖子。我已经在这个问题上纠结了好几天。我尝试将 C Dll 的 usbi2cio.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);

最佳答案

我有一个类似的问题,我通过编写自己的名为 Bridge 的 C 库修复了它,它可以处理复杂的 C API,但公开可以轻松与 C# 接口(interface)的简单方法。

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

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

关于c# - 将 C dll 函数导入 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15886492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com