【问题标题】:Marshalling array of struct (that contains an array of struct) from C# to Delphi (managed to unmanaged)将结构数组(包含结构数组)从 C# 编组到 Delphi(托管到非托管)
【发布时间】:2015-10-26 17:02:35
【问题描述】:

C# 结构:

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

【问题讨论】:

    标签: c# com marshalling unmanaged managed


    【解决方案1】:

    我已经设法“解决”了我的愚蠢问题!我替换了这个:

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

    与:

    [MarshalAs(UnmanagedType.ByValArray)]
    

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

    谢谢 W

    【讨论】:

    • 这解决了 Delphi 代码中的错误,但是内部结构(公共参数 [] 参数)仅包含第一项。所以我还有更多的工作要做。我显然需要在运行时以某种方式设置大小
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多