我正在尝试将C#中的结构传递给C ++库。我将结构作为对象传递,C ++函数将它作为指针(void *)。

我在传递结构方面遇到了问题。

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

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

  

"无法封送'参数#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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top