Вы также можете попробовать код, как в следующем, если то, что вы на самом деле хотите, чтобы передавать структуры как массив байтов:
int rawsize = Marshal.SizeOf(value);
byte[] rawdata = new byte[rawsize];
GCHandle handle = GCHandle.Alloc(rawdata, GCHandleType.Pinned);
Marshal.StructureToPtr(value, handle.AddrOfPinnedObject(), false);
handle.Free();
Это преобразует заданный объект значение в массив байтов rawdata. Я взял это из ранее написанного кода, и вам, возможно, придется адаптировать его к вашим потребностям, чтобы он действительно работал. Я использовал его для связи с некоторыми аппаратными средствами с определенными пользователем структурами, но он должен работать и для встроенных типов (в конце концов, это структуры, не так ли?)
Чтобы сделать элементы структуры правильно выровненными используйте атрибут StructLayout, чтобы указать один байт выравнивания:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
И затем использовать атрибут MarshalAs, сколько необходимо для полей, например, для встроенных массивов:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
byte[] _state;
код, чтобы получить структуру обратно из массива байтов что-то вроде этого:
public T GetValue<T>()
{
GCHandle handle = GCHandle.Alloc(RawValue, GCHandleType.Pinned);
T structure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),
typeof(T));
handle.Free();
return structure;
}
Конечно, вы должны знать тип, который вы хотите для этого работы ,
Обратите внимание, что это не будет обрабатывать сущность для себя.В моем проекте большинство полей были только одним байтом, поэтому это не имело значения, но для нескольких полей, где это было сделано, я просто сделал поля частными и добавленными общедоступными свойствами, которые позаботились бы о контенте (Jon Skeet's link из комментария к его ответ может вам помочь, я написал некоторые полезные функции для этого, так как мне было только немного).
Когда я нуждался в этом, я создал класс сообщений, который сохранил бы исходное значение (следовательно, метод GetValue, код вверху фактически является телом метода SetValue) и имел некоторый хороший метод удобства для получения значения отформатированный и т. д.
Nah, сделайте это с отражением :) – 2008-10-22 13:39:38