如何将托管的cli :: array <byte> ^编组到托管结构中?

时间:2016-09-16 19:29:44

标签: .net struct c++-cli marshalling

在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.Marshallpin_ptr的示例,但我不知道到底要去哪里。

1 个答案:

答案 0 :(得分:2)

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

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

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

考虑到这两个选择,我会选择自己进行转换,因为验证它是否正确要容易得多。要使.Net框架进行转换,您将不得不花时间使用InteropServices namespace中的属性,以使Marshal类使用与嵌入式C ++代码相同的内存表示形式。 。如果表示稍微偏离,那么细微的错误就会很容易进入,这在显式的Deserialize方法中不太可能发生。