Я определил структуру в С#, чтобы зеркалировать собственную структуру данных и использовал StructLayout of Sequential. Чтобы преобразовать структуру в 12 байтов (3x4 байта), требуемых методом Socket IOControl, я использую Marshal.Copy для копирования байтов в массив.
Поскольку структура содержит только типы значений, нужно ли привязать структуру до того, как я сделаю копию? Я знаю, что GC уплотняет кучу, и поэтому mem-адрес ссылочных типов может меняться во время GC. То же самое относится к типам присвоенных стека значений?
Текущая версия, которая включает операцию вывода, выглядит следующим образом:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct TcpKeepAliveConfiguration
{
public uint DoUseTcpKeepAlives;
public uint IdleTimeMilliseconds;
public uint KeepAlivePacketInterval;
public byte[] ToByteArray()
{
byte[] bytes = new byte[Marshal.SizeOf(typeof(TcpKeepAliveConfiguration))];
GCHandle pinStructure = GCHandle.Alloc(this, GCHandleType.Pinned);
try
{
Marshal.Copy(pinStructure.AddrOfPinnedObject(), bytes, 0, bytes.Length);
return bytes;
}
finally
{
pinStructure.Free();
}
}
}
Любые мысли?