小编典典

将元帅C ++结构数组转换为C#

c#

我在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”数组。

关于如何正确处理此问题的任何想法?


阅读 348

收藏
2020-05-19

共1个答案

小编典典

我会尝试为您的结构取消关联添加一些属性

[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以来已经有一段时间了,所以我很生锈。

2020-05-19