2016-11-23 7 views
-1

У меня есть 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); 
    } 
+0

Почему 'XgTunWrap.encapsulation (из unmPont' параметр _out_ Это странно, потому что вы просто назначая/распределения mem: –

+0

'- >>> catch (Exception ex) {throw;} <<< -' бесполезно. Удалите его, потому что он всегда вызывается. –

+0

Также 'Marshal.Copy (msg, 0, unmPont , -> msg.Length <-); '** должно быть **' Marshal.Copy (msg, 0, unmPont, -> lenghtAr <-); ' –

ответ

0

Спасибо @ Jeroen! Я сделал, как вы прокомментировали. Я удалил out перед IntPtr. А вот мой рабочий код:

UInt16 encapsulation(IntPtr pkt, 
        UInt32 src_ip, 
        UInt32 dst_ip, 
        UInt16 sport, 
        UInt16 dport, 
        UInt16 pktLen); 

И рабочее тело:

int lengthAr = Marshal.SizeOf(msg[0]) * msg.Length; 
IntPtr unmPont = Marshal.AllocHGlobal(lengthAr); 

try 
{ 
    Marshal.Copy(msg, 0, unmPont, lengthAr); 
    len = XgTunWrap.encapsulation(unmPont, 
            m_pList.m_DeviceHoA.IpAddress, 
            item.m_VptAliasHoA.IpAddress, 
            (ushort)taPort, 
            (ushort)taPort, 
            (ushort)msg.Length); 
    res = new byte[len]; 
    Marshal.Copy(unmPont, res, 0, (int)len);                   
} 
finally 
{ 
    Marshal.FreeHGlobal(unmPont); 
} 
Смежные вопросы