如何将托管 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.Marshallpin_ptr 的示例,但我不知道去哪里。

根据我的理解,总结评论中的新信息:

  • 字节数组通过网络到达。
  • 字节数组由一些嵌入式 C++ 代码生成(换句话说,不使用您的代码使用的 .Net class)。
  • 字节数组可以转换为几种可能的class,其中ReportDataStruct只是一种可能。

您的选择是编写一些方法将字节数组转换为 .Net 对象,或者让 .Net 框架中的某些东西为您做这种转换。 无法获取字节数组的内存并直接将其用作托管引用类型。

鉴于这两个选择,我会选择自己进行转换,因为验证它是否正确要容易得多。要让 .Net 框架进行转换,您将不得不花时间处理 InteropServices namespace 中的属性,以使 Marshal class 使用与嵌入式 C++ 相同的内存表示代码确实如此。如果表示略有偏差,则很容易出现细微的错误,而显式反序列化方法不太可能出现这种情况。