Маршал структура как другая структура в c# - PullRequest
0 голосов
/ 01 марта 2020

Давайте начнем с определения моих структур:

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);
    }
...