我如何将结构封送为指向结构的指针?

问题描述 投票:9回答:3

我正在尝试将结构从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) {...
c# pinvoke
3个回答
17
投票

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

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

当您将ref与结构结合使用时,它在概念上会传递地址。


13
投票

偶然地,UnmanagedType.LPStruct很少是正确的MarshalAs参数。 A quote from Adam Nathan是Microsoft员工:

仅在一种特定情况下才支持UnmanagedType.LPStruct:将System.Guid值类型作为具有额外间接级别的非托管GUID进行处理。


0
投票

关于@Rytmis的帖子的一些其他信息后续活动。

来自https://github.com/dotnet/runtime/blob/master/docs/coding-guidelines/interop-pinvokes.md


向导可以直接在签名中使用。当通过ref传递时,它们既可以通过ref传递,也可以通过[MarshalAs(UnmanagedType.LPStruct)]属性传递。

[MarshalAs(UnmanagedType.LPStruct)]应该only用于参考指南。

© www.soinside.com 2019 - 2024. All rights reserved.