如何将结构编组为指向结构的指针?
我试图将一个结构从C#传递到C ++库。 我将结构作为对象传递,C ++函数将它作为指针(void *)。
我有问题通过结构。
[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec);
这是我得到的运行时exception文本:
“无法封送’参数#1’:无效的托管/非托管类型组合(此值类型必须与Struct配对)。”
虽然我发现了一篇在这种情况下使用LPStruct的MSDN文章。
这是我试图编组的结构:
[StructLayout(LayoutKind.Sequential)] public struct UserRec { [MarshalAs(UnmanagedType.I4)] public int userParam1; }
这是C ++函数:
MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {...
尝试将结构作为ref参数传递。
[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)] public static extern IntPtr TheFunction(ref UserRec userRec);
当您使用结合结构的引用时,它在概念上传递地址。
顺便提一下, UnmanagedType.LPStruct
很少(如果有的话)是正确的MarshalAs
参数。 来自微软员工Adam Nathan的话 :
UnmanagedType.LPStruct仅支持一种特定情况: 将System.Guid值类型视为具有额外间接级别的非托管GUID。