当前位置:  开发笔记 > 编程语言 > 正文

将Marshal C++ struct数组转换为C#

如何解决《将MarshalC++struct数组转换为C#》经验,为你挑选了2个好方法。

我在C++中有以下结构:

#define MAXCHARS 15

typedef struct 
{
    char data[MAXCHARS];
    int prob[MAXCHARS];
} LPRData;

我正在调用一个函数来获取这些结构中的3个数组:

void GetData(LPRData *data);

在C++中我会做这样的事情:

LPRData *Results;
Results = (LPRData *)malloc(MAXRESULTS*sizeof(LPRData));
GetData( Results );

它会工作得很好,但在C#我似乎无法让它工作.我已经像这样创建了一个C#结构:

public struct LPRData
{

    /// char[15]
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 15)]
    public string data;

    /// int[15]
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 15)]
    public int[] prob;
}

如果我初始化其中3个(及其所有子数组)的数组并将其传递给此:

GetData(LPRData[] data);

它成功返回,但LPRData数组中的数据没有更改.

我甚至尝试创建一个大小为3 LPRData的原始字节数组,并将其传递给函数原型,如下所示:

GetData(byte [] data);

但在这种情况下,我将从第一个LPRData结构中获取"数据"字符串,但在此之后没有任何内容,包括来自同一LPRData的"prob"数组.

有关如何妥善处理此问题的任何想法?



1> denny..:

我会尝试在struct decloration中添加一些属性

[StructLayout(LayoutKind.Sequential, Size=TotalBytesInStruct),Serializable]
public struct LPRData
{
/// char[15]
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 15)]
public string data;

/// int[15]
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 15)]
public int[] prob;
}

*注意TotalBytesInStruct不用于表示变量

JaredPar也是正确的,使用IntPtr类可能会有所帮助,但是因为我使用了PInvoke所以我已经很长时间了.



2> JaredPar..:

处理指针时的一个技巧就是使用IntPtr.然后,您可以在指针上使用Marshal.PtrToStructure,并根据结构的大小递增以获得结果.

static extern void GetData([Out] out IntPtr ptr);

LPRData[] GetData()
{
    IntPtr value;
    LPRData[] array = new LPRData[3];
    GetData(out value);
    for (int i = 0; i < array.Length; i++)
    {
        array[i] = Marshal.PtrToStructure(value, typeof(LPRData));
        value += Marshal.SizeOf(typeof(LPRData));
    }
    return array;
}


我真正得到的是,你是通过增加指针来增加分配.toInt + sizeof(struct).增量不会只是sizeof(struct)吗?
第11行应该:如果运行64位,则将`+ =`更改为`=`,将`ToInt32`更改为`ToInt64`; 或者,删除`value.ToInt32()`?
推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有