从C#调用C DLL函数-参数结构太大或太复杂,无法封送
本文关键字:复杂 结构 调用 DLL 函数 参数 | 更新日期: 2023-09-27 17:59:13
我用C#从C DLL调用函数时遇到问题。我试图封送该结构,但异常告诉我的结构太大或太复杂,无法封送。。。我已经计算出完整大小的15256个字节。
原始的C函数如下所示:
int32_t CN_API SetConfig(int32_t handle, int32_t bId, ModeEnum Mode, ParamStruct params);
我在C#中定义的结构如下:
struct ParamStruct
{
int param1;
...
//Here are some primitve arrays and variables...
...
structArray1[16]
// |__...some integers
// |__structA
// |__...some variables
int param8
structB
// |__...some integer arrays and a float array
// |__structArray2[16]
// |__...some variables
enum param9
...
//here are some more structs and struct arrays
...
}
我知道"语法"不正确。只是你知道我的意思。
现在我想调用这个函数并将ParamStruct传递给它
我的问题是,我该怎么做?你们中有谁有解决我问题的好主意吗?可以用IntPtr做吗?或者,用C#重写我的结构,使其不那么复杂,这是最好的方法吗?
如果您需要更多详细信息,请告诉我。
我通过重新定义本机方法来接受byte*参数&手动将结构复制到字节数组中。
public override void ToByteArray(out byte[] bEeprom)
{
int arrOffs, arrOffs1, arrOffs2;
int length = Size();
int ptrOffset = 0;
byte[] convString;
int maxLen;
IntPtr ptr = Marshal.AllocHGlobal(length);
Marshal.WriteByte(ptr, ptrOffset, renumerationMode);
ptrOffset += sizeof(byte);
Marshal.WriteInt16(ptr, ptrOffset, (short)vendorID);
ptrOffset += sizeof(short);
Marshal.WriteInt16(ptr, ptrOffset, (short)productID);
ptrOffset += sizeof(short);
Marshal.WriteInt16(ptr, ptrOffset, (short)deviceID);
ptrOffset += sizeof(short);
Marshal.WriteByte(ptr, ptrOffset, config);
ptrOffset += sizeof(byte);
Marshal.WriteByte(ptr, ptrOffset, eepromVersion);
ptrOffset += sizeof(byte);
Marshal.WriteInt16(ptr, ptrOffset, hwVersion);
ptrOffset += sizeof(short);
for (arrOffs = 0; arrOffs < configFlags.Length; arrOffs++)
{
Marshal.WriteByte(ptr, ptrOffset, configFlags[arrOffs]);
ptrOffset += sizeof(byte);
}
......
Debug.Assert(ptrOffset == length);
bEeprom = new byte[length];
Marshal.Copy(ptr, bEeprom, 0, length);
Marshal.FreeHGlobal(ptr);
}