Je dois passer un tableau d'une structure de C++ à C#. J'ai le code suivant, qui crée d'abord une structure temporaire, puis memcpy
à l'adresse de la structure du côté C#. J'ai défini la structure des deux côtés avec le même ordre d'éléments. Lorsque je débogue, je vois que la structure temporaire est remplie correctement, temp_buf (l'adresse de la variable cible) est incrémentée dans la taille de la structure à chaque itération, et memcpy
ne renvoie aucune erreur.Passer un tableau de structure de C# à C++
Toutefois, seul le premier élément de la matrice est défini du côté C#.
Voici les définitions du côté C#:
[DllImport(@"MyAwesomeDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "[email protected]@[email protected]@@Z", CharSet = CharSet.Auto)]
public static extern Int32 GetCoolDevices(out UInt32 p_deviceCount, out Device_s p_devicesBuf);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct Device_s
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 51)]
public String DeviceName;
public UInt32 DeviceID;
}
Voici les définitions du côté 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();
}
.....
}
Et, voici comment je l'appelle:
UInt32 MyDecDeviceCnt = 0;
Device_s[] MyDecDevices = new Device_s[10];
int ret = GetCoolDevices(out MyDecDeviceCnt, out MyDecDevices[0]);
Toute suggestion est appréciée!
@ SamFisher83 - Votre suggestion n'a aucun sens. L'utilisation d'une chaîne est la procédure correcte. Bien sûr, les deux structures n'ont même pas la même taille, la structure C# est au moins de 12 bits plus grande. –
@Ramhound J'ai corrigé mon erreur de faute de frappe. Maintenant, device_name a 51 caractères. Y a-t-il encore une discordance? – mustafa