我正在尝试将结构数组从 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/