c# - 将结构体数组从 C# 编码到 VC++

标签 c# c++ pinvoke marshalling

我正在尝试将结构数组从 C# 编码到 VC++。

C++ 函数如下所示:

void myFunc(tFileListEntry* fileList);

并且tFileListEntry定义为:

typedef struct FILE_LIST
{
    uint16_t FileGroupCounter;
    uint32_t FileID;
    uint16_t NumbSamples;
} tFileListEntry;

在 C# 中,我声明了这样的函数:

[DllImport("MyLib", EntryPoint = "myFunc", CallingConvention = CallingConvention.Cdecl)]
public static extern void myFunc( [In, MarshalAs(UnmanagedType.LPArray)] tFileListEntry[] fileList);

并且tFileListEntry定义为:

[StructLayout(LayoutKind.Sequential)]
public class tFileListEntry
{
    public tFileListEntry(UInt16 fileGroupCounter, UInt32 fileId, UInt16 numbSamples)
    {
        FileGroupCounter = fileGroupCounter;
        FileID = fileId;
        NumbSamples = numbSamples;
    }

    public UInt16 FileGroupCounter;
    public UInt32 FileID;
    public UInt16 NumbSamples;
}

我可以在 C# 代码以及 C++ 库中设置断点。在托管方面,这些值看起来是正确的,但在非托管方面,我只得到垃圾。

我使用 Marshal.SizeOf() (在 C# 中)和 sizeof() (在 C++ 中)验证了结构体的大小两边都是 12 个字节,所以我不认为填充/包装是一个问题。

我做错了什么?

最佳答案

我认为这里的问题在于,在 C# 方面,您已将其声明为类,而不是结构。

这意味着当您在 C# 端创建数组时,数组的每个元素都是一个引用(4 或 8 字节,具体取决于架构)而不是结构(12 字节),这就是您所看到的结果。

尝试将 C# 类更改为结构体。

关于c# - 将结构体数组从 C# 编码到 VC++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27418405/

相关文章:

c# - Protobuf-net 和不可变消息的继承

c# - 无效的回发或回调参数错误?

c# - 在 .csproj 文件中,<None Include ="..."> 的作用是什么?

c++ - 使用 Xinput2 获取双 RawKeyPress 事件

c# - 难以从 C# 调用非托管 dll

C# P/调用 : native output parameter value won't reach managed code

c# - ASP.NET MVC 路由 - 博客自定义路由

c++ - 检查 bool 是否在混合 C/C++ 中定义

c++ - 如何在不相关类型的共享指针中共享相同的引用计数器?

c# - .NET PInvoke 在 Linux 和 Mac OS X 平台上可用吗?