【发布时间】:2014-12-11 08:32:01
【问题描述】:
我正在尝试将结构数组从 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++ pinvoke marshalling