I think this may be useful
http://www.codeproject.com/csharp/groupandmembers.asp
There is a difference in that the example code allocates the space for
the buffer in the p/invoked dll, but the use of sizeof and Marshal
class may help.
This is also has a good explanation.
http://msdn2.microsoft.com/en-us/library/z6cfh6e6(VS.80).aspx#cpcondefaultmarshalingforarraysanchor3
KeithR wrote:
> I am something of a newbie in the world of C# data structures, but I am
> writing an application that needs to call a legacy DLL using .net 1.1. That
> is no big deal mostly, but I am having trouble with one function. It is
> defined in the original C as
>
> UINT32 __stdcall GetState(
> UINT32 timeout,
> UINT32 client_id,
> void *status_array
> );
>
> status is defines as a pointer to 64 status records (structs) they are
> defined as
>
> typedef struct status_rec {
> UINT32 type;
> UINT32 state;
> UINT32 version;
> UINT32 flags;
> CHAR ip_address[15];
> CHAR filler[9];
> } status, *p_status
>
> I defined this in C# as
>
> [StructLayout=LayoutType.Sequential, Pack=1, CharSet = CharSet.Ansii]
> public struct status_rec {
> public UINT32 type;
> public UINT32 state;
> public UINT32 version;
> public UINT32 flags;
> [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1,
> SizeConst=15)]
> public CHAR ip_address[15];
> [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1,
> SizeConst=15)]
> public CHAR filler[9];
> }
>
> I made my call as
>
> status_rec[] status_array = new status_rec[64];
> GetState(
> timeout,
> client_id,
> ref status_array[0]
> );
>
> What I am getting in Status_array is the correct data in the first element,
> and all zeroes thereafter.
>
> Can anybody please point me to my mistake?