How to pass struct with unsigned char* from C# to C++?

Viewed 1324

I have some C++ dll with struct description and some methods:

struct MSG_STRUCT {  
    unsigned long dataSize;
    unsigned char* data;
}

And function for example:

unsigned long ReadMsg( unsigned long msgId, MSG_STRUCT* readMsg)
{
    readMsg->dataSize = someDataSize;
    readMsg->data = someData;
}

So I want to call this function from C#:

[StructLayout(LayoutKind.Sequential)]
struct MSG_STRUCT 
{
    UInt32 dataSize;
    byte[] data;
}

[DllImport("mydll.dll")]
public static Int32 ReadMsg( UInt32 msgId, ref MSG_STRUCT readMsg);

So I tried to call C# function like:

var readMsg = new MSG_STRUCT();
readMsg.data = new byte[4128];
Int32 res = ReadMsg( someMsgId, ref readMsg);

But I didn't get smth normal in data. I also tried to call ReadMsg with IntPrt type parameter, but Marshal.PtrToStructure gave me AccessViolationException sometimes.

I don't have any ideas how to pass a pointer to MSG_STRUCT from C# to C++ and receive the result as filled MSG_STRUCT.data

The final solutionthat worked for me: I used a part of solution offered by xanatos: I set CallingConvention = CallingConvention.Cdecl for my DllImport function. I found out that I also need to change:

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4128)]
public byte[] Data;

Thanks everyone for your help

2 Answers
Related