Структурный маршал в C # - PullRequest
6 голосов
/ 19 июня 2011

У меня есть следующая структура в C #

unsafe public struct control
    {
        public int bSetComPort;
        public int iComPortIndex;
        public int iBaudRate;
        public int iManufactoryID;
        public byte btAddressOfCamera;
        public int iCameraParam;
        public byte PresetNum;
        public byte PresetWaitTime;
        public byte Group;
        public byte AutoCruiseStatus;
        public byte Channel;
        public fixed byte Data[64];
    }

И функция, которую я использую, чтобы преобразовать ее в байтовый массив []:

 static byte[] structtobyte(object obj)
    {
        int len = Marshal.SizeOf(obj);
        byte[] arr = new byte[len];
        IntPtr ptr = Marshal.AllocHGlobal(len);
        Marshal.StructureToPtr(obj, ptr, true);
        Marshal.Copy(ptr, arr, 0, len);
        Marshal.FreeHGlobal(ptr);
        return arr;
    }

Когда я компилирую, это дает

Type 'System.Byte[]' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.

В чем может быть проблема?Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 19 июня 2011

SizeOf не работает с массивами. Вместо этого используйте array.Length * Marshal.SizeOf(elementType).

0 голосов
/ 19 июня 2011

Ошибка, о которой вы сообщаете как ошибка компиляции, фактически является ошибкой времени выполнения (ArgumentException). Если вы хотите использовать structtobyte для преобразования control в byte[], вы должны передать методу ссылку на control, а не на массив byte (byte[]).

control ctrl = new control();
byte[] bytes = structtobyte(ctrl);
...