Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
301 views
in Technique[技术] by (71.8m points)

marshalling - How to marshall array of structs in C#?

I've the following structure in C#:

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct RECORD
{
    public uint m1;
    public uint m2;
    public uint m3;
}

I need too pass an array (fixed length) of these structs over to native Code, which writes some data to these structures. The array is allocated in C# and passed over to the C dll. I declared the imported function as:

[DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void doIt(RECORD[] dataRecord);

but I don't get any data back. I already tried the PInvoke Interop Assistant. Should I use IntPtr here? Any ideas?

Edit:

Here is the C# code to call the native function:

RECORD[] rec = new RECORD[256];
doIt(rec);
// values of rec are all zero here

Here is the C function:

int doIt(RECORD* rec)
{
    // deref pointer and write some data
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I'm far from a P/Invoke expert, but I wonder if making it an in/out parameter might help:

DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void doIt([In, Out] RECORD[] dataRecord);

I wouldn't have expected that to be necessary though, as with LayoutKind.Sequential I'd hope that your struct is already a blittable type, and that the array would be blittable too.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...