c# - 如何将结构编码为指向结构的指针?

标签 c# pinvoke

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

我在传递结构时遇到问题。

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

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

"Cannot marshal 'parameter #1': Invalid managed/unmanaged type combination (this value type must be paired with Struct)."

尽管我发现了一篇 MSDN 文章正是在这种情况下使用 LPStruct。

这是我要整理的结构:

[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);

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

关于c# - 如何将结构编码为指向结构的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/827672/

相关文章:

c# - 在 C# 中计算(复杂的)十进制数数组

c# - 方法在 3310 次成功后失败

c# - 以编程方式打开 "Folder Options"对话框

c# - P-Invoke 解码分配在 DLL 中的结构数组

c# - 如何从 C# 调用 C++ DLL 函数

c# - 检查 List<T> 是否包含要排除的可选单词的重复项

c# - 透明表单无法正确显示文本

c# - 无法访问 Newtonsoft.Json.Linq.JProperty 上的子值 - 使用 LinQ 检查 JObject 时发生错误

c# - 在 LINQ 语句中检查一周的第一天

c# - DllImport 期间出现 FatalExecutionEngineError