Как преобразовать одну структуру C # в другую, как в C ++? - PullRequest
1 голос
/ 29 июля 2010

Предположим, что у нас есть две структуры C #:

    [Serializable, StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct ByteStructure 
    {
        public byte byte0;
        public byte byte1;
        public byte byte2;
        public byte byte3;
        public byte byte4;
        public byte byte5;
        public byte byte6;
        public byte byte7;
        public byte byte8;
        public byte byte9;
        public byte byteA;
        public byte byteB;
        public byte byteC;
        public byte byteD;
        public byte byteE;
        public byte byteF;
     }

     [Serializable, StructLayout(LayoutKind.Sequential, Pack = 1)]
     public struct IntStructure
     {
        public int i0;
        public int i1;
        public int i2;
        public int i3;
      }

      ByteStructure bs;
      IntStructure is;
...

Как преобразовать одну структуру в другую, как в C ++:

is = (IntStructure)bs;

или

bs = (ByteStructure)is;

1 Ответ

3 голосов
/ 04 июня 2011

Самый простой способ - использовать класс Marshal и неуправляемую память.

    static void Main(string[] args)
    {
        ByteStructure b = new ByteStructure();
        IntStructure i = new IntStructure();
        i.i0 = 0xa;
        i.i1 = 0xb;
        i.i2 = 0xc;
        i.i3 = 0xd;

        Debug.Assert(Marshal.SizeOf(typeof(IntStructure)) == Marshal.SizeOf(typeof(ByteStructure)));

        IntPtr mem = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntStructure)));
        Marshal.StructureToPtr(i, mem, false);
        b = (ByteStructure)Marshal.PtrToStructure(mem, typeof(ByteStructure));
        Marshal.FreeHGlobal(mem);

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...