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
}
From stackoverflow
-
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.SequentialI'd hope that your struct is already a blittable type, and that the array would be blittable too.SDD : That did the trick, thx. Are there other places where these keywords are used? I've never seen them beforeSDD : 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.
0 comments:
Post a Comment