在C / CLI上,我试图构建一个函数,将从托管类接收的字节数组缓冲区转换为托管结构。该结构的组成有一些枚举。这是我的代码:
public enum class ControlEnum {
LOCAL,
REMOTE,
EMERGENCY,
ERROR
}
public enum class StateEnum {
ON,
OFF
}
public enum class TimeoutEnum {
10SEC,
30SEC,
1MIN,
5MIN
}
public enum class StatusEnum {
OK,
FAILURE
}
public ref struct ReportDataStruct{
public:
ControlEnum control;
StateEnum state;
TimeoutEnum timeout;
Single value;
Int32 attenuation;
};
public ref struct ReportStruct {
public:
StatusEnum reportStatus;
DateTime reportDataTime;
cli::array<byte>^ reportData;
};
我需要的是将reportData
字段从ReportStruct
映射到应用程序使用的ReportDataScruct
。通过具有结构化类型,我可以在应用程序上直接访问它;
在普通的C ++中,我将构建一个简单的函数,如:
ReportDataStruct& convert(ReportStruct& report)
{
return (ReportDataStruct&) report.reportData;
}
考虑到这两种结构都是管理的,C ++ / CLI上的等价物是什么?我找到了使用System.Interop.Marshall
和pin_ptr
的示例,但我不知道到底要去哪里。
答案 0 :(得分:2)
根据我的理解,总结评论中的新信息:
ReportDataStruct
只是一种可能。您的选择是编写一些方法将字节数组转换为.Net对象,或者让.Net框架中的某些内容为您进行转换。 无法获取字节数组的内存并直接将其用作托管引用类型。
考虑到这两个选择,我会选择自己进行转换,因为验证它是否正确要容易得多。要使.Net框架进行转换,您将不得不花时间使用InteropServices namespace中的属性,以使Marshal类使用与嵌入式C ++代码相同的内存表示形式。 。如果表示稍微偏离,那么细微的错误就会很容易进入,这在显式的Deserialize方法中不太可能发生。