如何将结构编组为指向结构的指针?

THX*_*138 9 c# pinvoke

我试图将一个结构从C#传递到C++库.我将结构作为对象传递,C++函数将它作为指针(void*).

我有问题通过结构.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec);
Run Code Online (Sandbox Code Playgroud)

这是我得到的运行时异常文本:

"无法封送'参数#1':无效的托管/非托管类型组合(此值类型必须与Struct配对)."

虽然我发现了一篇在这种情况下使用LPStruct的MSDN文章.

这是我试图编组的结构:

[StructLayout(LayoutKind.Sequential)]
public struct UserRec {
    [MarshalAs(UnmanagedType.I4)]
    public int userParam1;
}
Run Code Online (Sandbox Code Playgroud)

这是C++函数:

MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {...
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 17

尝试将结构作为ref参数传递.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction(ref UserRec userRec);
Run Code Online (Sandbox Code Playgroud)

当您使用结合结构的引用时,它在概念上传递地址.

  • 在这种情况下,你甚至不需要[MarshalAs]. (4认同)

Ryt*_*mis 13

顺便说一句,UnmanagedType.LPStruct很少,如果有的话,正确的MarshalAs论点.来自微软员工Adam Nathan的话:

UnmanagedType.LPStruct仅支持一种特定情况:将System.Guid值类型视为具有额外级别间接的非托管GUID.