tags:

views:

2686

answers:

1

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
}
+3  A: 

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.

Jon Skeet
That did the trick, thx. Are there other places where these keywords are used? I've never seen them before
SDD
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.
SDD