11

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 } 

1 Answer 1

14

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.

Sign up to request clarification or add additional context in comments.

3 Comments

That did the trick, thx. Are there other places where these keywords are used? I've never seen them before
From MSDN: [refering to arrays of blittable types] However, these types are actually marshaled as In parameters, and you must apply the InAttribute and OutAttribute attributes if you want to marshal the argument as an In/Out parameter.
Thanks this worked for me - and ended a two hour struggle to get this done.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.