Reputation: 21750
I am trying to pass a structure from C# into C++ library. I pass structure as an object, and C++ function expects it as a pointer (void *).
I am having problem passing the structure.
[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec);
Here is the run-time exception text I get:
"Cannot marshal 'parameter #1': Invalid managed/unmanaged type combination (this value type must be paired with Struct)."
Though I found an MSDN article that uses LPStruct in exactly this context.
This is my structure I'm trying to marshal:
[StructLayout(LayoutKind.Sequential)]
public struct UserRec {
[MarshalAs(UnmanagedType.I4)]
public int userParam1;
}
This is C++ function:
MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {...
Upvotes: 13
Views: 23516
Reputation: 3249
Some additional information followup regarding @Rytmis's post.
From https://learn.microsoft.com/en-us/dotnet/standard/native-interop/best-practices#guids:
DO NOT Use
[MarshalAs(UnmanagedType.LPStruct)]
for anything other than ref GUID parameters.
Upvotes: 3
Reputation: 32067
Incidentally, UnmanagedType.LPStruct
is rarely, if ever, the correct MarshalAs
argument. A quote from Adam Nathan who is a Microsoft employee:
UnmanagedType.LPStruct is only supported for one specific case: treating a System.Guid value type as an unmanaged GUID with an extra level of indirection.
Upvotes: 21
Reputation: 755547
Try passing the structure as a ref parameter.
[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction(ref UserRec userRec);
When you use a ref combined with a structure, it conceptually passes the address.
Upvotes: 22