如何从C#到C 结构
How to marshall struct from c# to c++?
本文关键字:结构 更新时间:2023-10-16
我有一项任务,可以基于C 结构(也带有内部结构)创建编组C#structs。然后,我应该将此C#结构发送到Dllimport C 方法。
基础C 结构下面:
struct WProtims_Task_Table
{
Protims_DWN_OS_Task p_List_OS_Task[20];
Protims_CMD_CFSYS_Task p_List_CFSYS_Task[20];
int iTotalTaskNum;
} ;
struct WProtims_QueryDownloadTask_ACK
{
BYTE SystemDateTime[6];
BYTE TaskTableLen[4];
BYTE RespCode[1];
WProtims_Task_Table *p_Total_DWN_Tasks;
} ;
一个结构(wprotims_querydownloadtask_ack)包含指向其他结构数组(wprotims_task_table *)的指针。我在下面创建C#结构:
[StructLayout(LayoutKind.Sequential)]
class WProtims_Task_Table
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public Protims_DWN_OS_Task[] p_List_OS_Task = new Protims_DWN_OS_Task[20];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public Protims_CMD_CFSYS_Task[] p_List_CFSYS_Task = new Protims_CMD_CFSYS_Task[20];
public int iTotalTaskNum;
} ;
[StructLayout(LayoutKind.Sequential)]
class WProtims_QueryDownloadTask_ACK
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public byte[] SystemDateTime;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] TaskTableLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
public byte[] RespCode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public WProtims_Task_Table[] p_Total_DWN_Tasks = new WProtims_Task_Table[20];
} ;
当我将此结构发送到C 方法时,我获得了正确的第一个字段(SystemDateTime,TaskTableLen,Respcode的字节数组),但是最后一个字段(指向WPROTIMS_TASK_TASK_TASK_TABL的指针)包含垃圾。我找不到一种方法可以正确地将数组数据正确到C 结构?
我强烈推荐Swig。我定期使用它将C 对象带入C#,并且非常简单。
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?