从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#重写我的结构,使其不那么复杂,这是最好的方法吗?

如果您需要更多详细信息,请告诉我。

从C#调用C DLL函数-参数结构太大或太复杂,无法封送

我通过重新定义本机方法来接受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);
}