从C#到Delphi(托管到非托管)的编组数组struct(包含一个struct数组)

时间:2015-08-04 10:24:51

标签: c# com marshalling unmanaged managed

C#struct:

public struct Table
{
    [MarshalAs(UnmanagedType.LPArray)]
    public Parameters[] parameters;
    public string Name;
    etc...
}

public struct Parameters
{
    public string parameterName;
    public string parametervalue;
}

我不知道'Parameters [] parameters'数组在设计时的长度。

所以我可以:

Table[] tables = new Table[RandomNumber];

for (int i = 0; i < RandomNumber; i++)
{
    for (int j=0; j<AnotherRandomNumber; j++)
    {
        tables[i].parameters[j] = new Parameters() { parameterName = "", parametervalue = "" };
    }
}

现在我想将表数组传递回非托管代码(Delphi)

界面如下所示:

int GetTables([Out, MarshalAs(UnmanagedType.LPArray)] out Table[] results);

C#中的方法:

public int GetTables(out ReportTable[] results)

但Delphi代码出错:

无法编组字段...数组文件必须与ByValArray或SafeArray配对。

我尝试了各种UnmanagedType.xxx组合,但无论如何都会出错。

有什么想法吗?

由于 w ^

1 个答案:

答案 0 :(得分:0)

我设法'修复'我的愚蠢问题!我取代了这个:

public struct Table
{
    [MarshalAs(UnmanagedType.LPArray)]
    public Parameters[] parameters;
    public string Name;
    etc...
}

使用:

[MarshalAs(UnmanagedType.ByValArray)]

我之前的印象是,我必须传递stcurt数组的大小,但事实并非如此。

由于 w ^