2

I have a function extracted from a delphi dll

function func_name(par1: Byte; par2: struct1) : boolean

Struct 1 is made up of :

struct1 = packed record
    Number: Byte;
    arrStr : array[1..8] of struct2;
end

Moreover struct2 is made up of:

struct2 = packed record
    Code: Byte;
    Price: Single;
end

Now using C# i am trying to pass a same time of structure to delphi using the following

First i created my structures:

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct struct2
{
    public byte code;
    public Single price;
}

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct struct1
{
    public byte Number;

    [MarshalAs(UnmanagedType.LPArray)]
    public struct2[] Prices;

    public struct1(int elements)
    {
        Number = 0;
        arrStr = new struct2[elements];
    }
}

Note elements is always 8.

So when i try to run the code thus filling the array and passing it to the function i get the following error:

Invalid managed/unmanaged type combination (Array fields must be paired with ByValArray or SafeArray)."

David Heffernan
  • 601,492
  • 42
  • 1,072
  • 1,490
Combinu
  • 882
  • 2
  • 10
  • 31

1 Answers1

2

The array is inline in the struct. It is not a pointer. So instead of

[MarshalAs(UnmanagedType.LPArray)]

you must use

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
David Heffernan
  • 601,492
  • 42
  • 1,072
  • 1,490
  • Great job! It worked just fine! I tried byValArray but didn't define the size! Thanks again! – Combinu Jun 02 '15 at 13:45
  • 1
    FWIW the docs say: *When the MarshalAsAttribute.Value property is set to ByValArray, the SizeConst field must be set to indicate the number of elements in the array. The ArraySubType field can optionally contain the UnmanagedType of the array elements when it is necessary to differentiate among string types. You can use this UnmanagedType only on an array that whose elements appear as fields in a structure.* You can ignore the grammar snafu in the final sentence!! – David Heffernan Jun 02 '15 at 13:52
  • Thanks very much @david – Combinu Jun 02 '15 at 14:09