Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > pinvoke


Автор: klyxa 7.2.2011, 17:54
привет. есть структура на с

Код

typedef struct __eth_header__
{
    UCHAR DstMAC[6];
    UCHAR SrcMAC[6];
    USHORT EthType; 
} t_eth_head;

typedef struct __packet__
{
    t_eth_head header;
    UCHAR data[50];
} ь_packet;


вот так описал на с#

Код

        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct t_eth_head
        {
            /// UCHAR[6]
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 6)]
            public string DstMAC;
            /// UCHAR[6]
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 6)]
            public string SrcMAC;
            /// USHORT->unsigned short
            public ushort EthType;
        }


        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct t_packet
        {
            /// t_eth_head->__eth_header__
            public t_eth_head header;
            /// UCHAR[50]
            [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 50)]
            public string data;
        }


сигнатура 

Код

        [DllImport("my_dll.dll", EntryPoint = "DoReadProc", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool DoReadProc(ref t_packet p);


и примерно такой вызов

Код

        static void Main(string[] args)
        {
            //...

            t_packet pckt = new t_packet();
            while (true)
            {
                if (DoReadProc(ref pckt))
                    break;
            }
            
            //..
        }


данные на стороне "си" успешно записываются, но в мак адресе или в  данных встречается 0х00,а так как указан тип public string DstMAC;
то всё что после 0х00 отбрасывается. как мне исправить, описать структуру на стороне c#?




Автор: klyxa 7.2.2011, 19:29
Код

        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct t_eth_head
        {

            /// UCHAR[6]
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6)]
            public byte[] DstMAC;

            /// UCHAR[6]
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6)]
            public byte[] SrcMAC;

            /// USHORT->unsigned short
            public ushort EthType;
        }


        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct t_packet
        {

            /// t_eth_head->__eth_header__
            public t_eth_head header;

            /// UCHAR[50]
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 50)]
            public byte[] data;
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)