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)."

3
  • @Jerry No there are not Commented Jun 2, 2015 at 13:42
  • @David that's why I deleted my comment immediately when I saw your answer (seconds after I posted it). I just remember many similar cases which were fixed by not using "packed" records and just using plain records. Commented Jun 2, 2015 at 13:44
  • @Jerry What matters is that both sides match. Commented Jun 2, 2015 at 13:46

1 Answer 1

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)]
Sign up to request clarification or add additional context in comments.

2 Comments

Great job! It worked just fine! I tried byValArray but didn't define the size! Thanks again!
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!!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.