У меня есть XgTunWrap.encapsulation()Получить массив байт байт Marshal
UInt16 encapsulation(out IntPtr pkt, UInt32 src_ip, UInt32 dst_ip, UInt16 sport, UInt16 dport, UInt16 pktLen);
функции (C++ DLL в C#), который принимает байты указателя массива и инкапсулирует этот байты массив и возвращает длину массива байт. Я пытаюсь получить инкапсулированный массив байтов, используя Marshalling, но получая ошибку нарушения доступа к памяти.
Ниже мой исходный код, который дает ошибку. Есть ли способ получить инкапсулированный массив байтов?
int lenghtAr = Marshal.SizeOf(msg[0]) * msg.Length;
IntPtr unmPont = Marshal.AllocHGlobal(lenghtAr);
try
{
Marshal.Copy(msg, 0, unmPont, msg.Length);
len = XgTunWrap.encapsulation(out unmPont, m_pList.m_DeviceHoA.IpAddress, item.m_VptAliasHoA.IpAddress, (ushort)taPort, (ushort)taPort, (short)msg.Length);
res = new byte[len];
Marshal.Copy(unmPont, res, 0, (int)len);
}
catch (Exception ex)
{throw; }
finally
{
Marshal.FreeHGlobal(unmPont);
}
Почему 'XgTunWrap.encapsulation (из unmPont' параметр _out_ Это странно, потому что вы просто назначая/распределения mem: –
'- >>> catch (Exception ex) {throw;} <<< -' бесполезно. Удалите его, потому что он всегда вызывается. –
Также 'Marshal.Copy (msg, 0, unmPont , -> msg.Length <-); '** должно быть **' Marshal.Copy (msg, 0, unmPont, -> lenghtAr <-); ' –