Marshalling: unmanaged strcture containing array into C#

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • coolmandar
    New Member
    • Feb 2009
    • 2

    Marshalling: unmanaged strcture containing array into C#

    Hi,
    I have some C union which are mapped on C# as below

    Code:
    [StructLayout(LayoutKind.Explicit, Pack = 4)]
        public struct service_choice_u
        {
            [FieldOffset(0)]
            public RPM_RESPONSE m_stRPM_Response;        
            [FieldOffset(0)]
            public PRIVATE_TRANSFER_REQUEST pt_request;
        }
    Code:
    [B]//Structure to note[/B]
        [StructLayout(LayoutKind.Explicit, Pack = 4)]
        public struct PRIVATE_TRANSFER_REQUEST
        {
            [FieldOffset(0)]
            public UInt32 m_u32VendorID;
            [FieldOffset(4)]
            public UInt32 m_u32ServiceNumber;
            [FieldOffset(8)]
            public UInt32 m_u32DataLength;       
    [B]//See offset[/B]
            [FieldOffset(40)]
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = StackConstants.MAX_PT_SERVICE_PARAMETER_BYTE_LENGTH)]
            public byte[] m_ai8ServiceParameters;
            [FieldOffset(140)]
            public byte m_bIsConfirmedRequest;
            [FieldOffset(141)]
            public byte m_bIsSerParaPresent;
        }
    
    
        [StructLayout(LayoutKind.Explicit, Pack = 4)]
        public struct RPM_RESPONSE
        {
            [FieldOffset(0)]
            public byte m_i8ArrayIndexPresent;
            [FieldOffset(4)]
            public int m_i32ErrorClass;
            [FieldOffset(8)]
            public int m_i32ErrorCode;
            [FieldOffset(12)]
            public int m_i32ObjectType;
            [FieldOffset(16)]
            public int m_i32ObjectInstance;
            [FieldOffset(20)]
            public int m_i32ObjectProperty;
            [FieldOffset(24)]
            public uint m_u32ArrayIndex;
            [FieldOffset(28)]
            public int m_eAccessType;
            [FieldOffset(32)]
            public int m_i32StringLen;
            [FieldOffset(36)]
            public int m_pi8PropValue;
            [FieldOffset(40)]
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 96)]
            public byte[] bacnet_property_value_structure;
            [FieldOffset(136)]
            public int m_pstNext;
        }

    But when PRIVATE_TRANSFE R_REQUEST structure is change to following, it is generating Type load exception
    Code:
    //Structure to note
        [StructLayout(LayoutKind.Explicit, Pack = 4)]
        public struct PRIVATE_TRANSFER_REQUEST
        {
            [FieldOffset(0)]
            public UInt32 m_u32VendorID;
            [FieldOffset(4)]
            public UInt32 m_u32ServiceNumber;
            [FieldOffset(8)]
            public UInt32 m_u32DataLength;       
    [B]//See offset[/B]
            [FieldOffset(12)]
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = StackConstants.MAX_PT_SERVICE_PARAMETER_BYTE_LENGTH)]
            public byte[] m_ai8ServiceParameters;
            [FieldOffset(112)]
            public byte m_bIsConfirmedRequest;
            [FieldOffset(113)]
            public byte m_bIsSerParaPresent;
        }

    Exception:
    An unhandled exception of type 'System.TypeLoa dException' occurred in Unknown Module.

    Additional information: Could not load type 'xxxx.BACnetSta ckIntegration.S tructures.servi ce_choice_u' from assembly 'xxxx.BACnetSta ckIntegration, Version=1.0.11. 0, Culture=neutral , PublicKeyToken= null' because it contains an object field at offset 0 that is incorrectly aligned or overlapped by a non-object field.
Working...