Давайте начнем с определения моих структур:
public struct structure1
{
Int16 num1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 200)]
byte[] unmanaged;
}
public struct structure2
{
Int16 num1;
Int16 num2;
}
public struct structure3
{
Int16 num1;
Int32 num2;
Int16 num3;
}
Я не хочу «упорядочивать» управляемую структуру как разнородную структуру, скажем, от struct1 до structure3.
Визуализация:
/----------------------------------structure1----------------------------------------------...
/-------num1--------|-----------------------------------unmanaged--------------------------...
|--Byte1--|--Byte2--|--Byte3--|--Byte4--|--Byte5--|--Byte6--|--Byte7--|--Byte8--|--Byte9--|...
\-------num1--------|-----------------num2------------------|--------num3-------/
\----------------------------------structure3-----------------------------------/
(я знаю, что в основном то, что я делаю в структуре 1, представляет собой объединение структуры 2 и структуры 3, и я мог бы использовать атрибут FieldOffset , чтобы записать все 3 структуры в одну структуру, но в моем реальном случае невозможно узнать фактическое смещение, и оно могло бы измениться выделить больше неуправляемой памяти (а затем не забудьте освободить ее), и мне это не нужно, в основном есть лучший способ сделать это:
private TO ReMarshal<FROM, TO>(FROM structure)
{
IntPtr unmanaged_address = Marshal.AllocHGlobal(Marshal.SizeOf<FROM>());
Marshal.StructureToPtr<FROM>(structure, unmanaged_address, false);
return Marshal.PtrToStructure<TO>(unmanaged_address);
}