如何将托管 cli::array<byte>^ 编组到托管结构中?
How to marshall a managed cli::array<byte>^ into a managed structure?
在 C/CLI 我正在尝试构建一个函数,将从托管 class 接收到的字节数组缓冲区转换为托管结构。该结构在其组成上有一些枚举。这是我的代码:
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
的示例,但我不知道去哪里。
根据我的理解,总结评论中的新信息:
- 字节数组通过网络到达。
- 字节数组由一些嵌入式 C++ 代码生成(换句话说,不使用您的代码使用的 .Net class)。
- 字节数组可以转换为几种可能的class,其中
ReportDataStruct
只是一种可能。
您的选择是编写一些方法将字节数组转换为 .Net 对象,或者让 .Net 框架中的某些东西为您做这种转换。 无法获取字节数组的内存并直接将其用作托管引用类型。
鉴于这两个选择,我会选择自己进行转换,因为验证它是否正确要容易得多。要让 .Net 框架进行转换,您将不得不花时间处理 InteropServices namespace 中的属性,以使 Marshal class 使用与嵌入式 C++ 相同的内存表示代码确实如此。如果表示略有偏差,则很容易出现细微的错误,而显式反序列化方法不太可能出现这种情况。
在 C/CLI 我正在尝试构建一个函数,将从托管 class 接收到的字节数组缓冲区转换为托管结构。该结构在其组成上有一些枚举。这是我的代码:
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
的示例,但我不知道去哪里。
根据我的理解,总结评论中的新信息:
- 字节数组通过网络到达。
- 字节数组由一些嵌入式 C++ 代码生成(换句话说,不使用您的代码使用的 .Net class)。
- 字节数组可以转换为几种可能的class,其中
ReportDataStruct
只是一种可能。
您的选择是编写一些方法将字节数组转换为 .Net 对象,或者让 .Net 框架中的某些东西为您做这种转换。 无法获取字节数组的内存并直接将其用作托管引用类型。
鉴于这两个选择,我会选择自己进行转换,因为验证它是否正确要容易得多。要让 .Net 框架进行转换,您将不得不花时间处理 InteropServices namespace 中的属性,以使 Marshal class 使用与嵌入式 C++ 相同的内存表示代码确实如此。如果表示略有偏差,则很容易出现细微的错误,而显式反序列化方法不太可能出现这种情况。