将结构数组从C#传递到C++; 我需要把一个结构数组从C++传递到C语言。我有下面的代码,它首先创建一个临时结构,然后执行memcpyC#端结构的地址。我用相同的元素顺序定义了两侧的结构

将结构数组从C#传递到C++; 我需要把一个结构数组从C++传递到C语言。我有下面的代码,它首先创建一个临时结构,然后执行memcpyC#端结构的地址。我用相同的元素顺序定义了两侧的结构,c#,c++,marshalling,C#,C++,Marshalling,当我调试时,我看到临时结构被正确填充,temp_buf(目标变量的地址)在每次迭代时在结构的大小上递增,并且memcpy不会返回任何错误 但是,只有数组的第一项设置在C#端 以下是C侧的定义: 下面是C++侧的定义: #pragma pack (1) typedef struct { TCHAR device_name [51]; UINT32 device_rid; } DEVICE_S; int GetDevices (UINT32 *device_count, DEVI

当我调试时,我看到临时结构被正确填充,temp_buf(目标变量的地址)在每次迭代时在结构的大小上递增,并且
memcpy
不会返回任何错误

但是,只有数组的第一项设置在C#端

以下是C侧的定义:

下面是C++侧的定义:

#pragma pack (1)
typedef struct
{
    TCHAR device_name [51];
    UINT32 device_rid;
} DEVICE_S;


int GetDevices (UINT32 *device_count, DEVICE_S *devices_buf)
{
....

    while(....)
    {
        DEVICE_S tmp_device;
        memset(&tmp_device, 0, sizeof(DEVICE_S));

        tmp_device.device_id = 5;
        sprintf( tmp_device.device_name, "a string");

        DEVICE_S *temp_buf = &(devices_buf[i]);
        size_t mysize =  sizeof(DEVICE_S);
        memcpy(temp_buf, &tmp_device, mysize);

        i++;
        getNextDevice();
    }

.....
}
我这样称呼它:

UInt32 MyDecDeviceCnt = 0;
Device_s[] MyDecDevices = new Device_s[10];
int ret = GetCoolDevices(out MyDecDeviceCnt, out MyDecDevices[0]);

任何建议都将不胜感激

您创建的API有问题。在托管端为数组分配内存(10个元素),但不将数组中的元素数传递给非托管端。封送处理程序无法确定是否要封送10个元素,而非托管代码不知道要写入的缓冲区的大小

可以使用向封送拆收器提供有关数组大小的信息。也看看这篇文章。(特别是有关C样式数组的信息。)


考虑到API的性质,您可以对其进行更改,以便在非托管端分配内存。您必须使用安全阵列或hglobal来允许在受管端释放内存。

您还应该提到
TCHAR device_name[20]
vs
SizeConst=51
--这将导致
DeviceID
驻留在错误的偏移量。我认为这是一个简单的输入错误,但需要加以纠正。@MartinLiveSage-该错误不太可能是输入错误。@MartinLiveSage谢谢,但我不确定这是否是问题所在。如果我从结构中删除字符串,并且只有整数,那么它就可以正常工作。在非托管端,我在每次迭代时都有正确的内存位置地址。似乎内存在非托管端设置正确,但当我切换回托管端时,内存不知怎的(?)丢失了。@mustafa:字符串不同,因为它们是指针。从调用返回时,封送拆收器必须遵循这些指针,并从指向的数据创建托管字符串。封送拆收器仅对第一个元素执行此操作,除非您向其提供有关数组大小的信息。@SamFisher83-您的建议毫无意义。使用字符串是正确的过程。当然,这两个结构的大小甚至不一样,C#结构至少要大12位。@Ramhound我纠正了我的打字错误。现在,设备名称是51个字符长。是否仍然存在不匹配?
UInt32 MyDecDeviceCnt = 0;
Device_s[] MyDecDevices = new Device_s[10];
int ret = GetCoolDevices(out MyDecDeviceCnt, out MyDecDevices[0]);