C#嵌套结构编组

时间:2014-11-04 15:08:38

标签: c# interop marshalling

目前我正在使用C#编写一个用于导出方法的dll(通过UnmanagedExports NuGet包),并且应该由非托管应用程序使用。

假设我们将以下非托管结构传递给托管dll:

struct RecordData {
     int x, y;
     char description[64];
}

然后使用它我需要创建它的C#对应物应该是这样的:

struct RecordData {
    public int x, y;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=64)]
    public string description;
}

然后传递给IntPtr参数。

到目前为止,一切都很清楚。但是如果我有另一个包含指向第一个结构的指针的结构呢?

非托管部分:

struct Record {
    char name[64];
    RecordData* data;
    int data_len;
};

此处数据指向非托管堆中的某处, data_len 是数组的长度,结构也从非托管代码传递到托管代码。

在这种情况下如何执行编组?只有 RecordData * 成员才能使用托管数据类型(由于字符串成员)。 在C#部分,我可以将数据成员声明为 IntPtr ,当然,并使用 Marshal.PtrToStructure 创建一个数组,但之后我会有创建一些额外的数据结构来使用检索到的数据,因为 IntPtr 除了前沿接口函数之外没有多大意义。

问题是:是否可以设置编组参数,以便将非托管 RecordData *数据指针自动编组到托管对应的托管阵列?或者使用 IntPtr 是唯一的解决方案?

我想要的是一个带有RecordData数组的C#Record结构,如下所示:

struct Record {
    [some marshaling params]
    public string name;
    [...]
    public RecordData [] data;
    int data_len; //redundant?
};

数据数组未嵌入结构本身,但是从非托管代码传递为指向某个缓冲区的指针。

编辑:正在创建一个自定义编组程序正确的方式来做我想要的事情吗?

0 个答案:

没有答案