Как выполнить возврат массива структур от C до C# - PullRequest
0 голосов
/ 25 марта 2020

Могу ли я попросить помощи относительно следующего?

У меня есть функция в C dll, которая возвращает массив структур. Я не могу изменить исходный код. В качестве теста я написал собственный C dll, чтобы вернуть массив структур, чтобы в качестве первого теста увидеть, как его вызвать из C#.

Итак, структура действительно проста :

typedef struct
{
    int version;
    char name[1024];
    double top_depth;
    float latitude;
}Info_Test;

Вот мой C код функции, которую я sh должен вызвать:

Info_Test* GetInfoArray_Test()
{
    static Info_Test dit[2];

    dit[0].version = 1;
    sprintf_s(dit[0].name, 6, "%s", "One");
    dit[0].top_depth = 1.1;
    dit[0].latitude = -1.1f;

    dit[1].version = 2;
    sprintf_s(dit[1].name, 6, "%s", "Two");
    dit[1].top_depth = 2,2;
    dit[1].latitude = -2.2f;

    return &(dit[0]);
}

Я могу назвать эту форму C клиентом без проблем, так как следует:

Info_Test* pDIT = _GetInfoArray_Test();

, где _GetInfoArray_Test - указатель на функцию, загружаемый путем динамического связывания с C dll. Работает нормально, может ссылаться на pDIT [0] и pDIT [1] без проблем.

Теперь, как вызвать это из C#?

У меня есть следующее, но это только дает мне доступ к первому из двух элементов в возвращаемом массиве:

[DllImport("MyMathDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr GetInfoArray_Test();

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Info_Test
{
    public int version;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
    public string name;
    public double top_depth;
    public float latitude;
}

IntPtr ptr3 = GetInfoArray_Test();
Info_Test dit = (Info_Test)Marshal.PtrToStructure(ptr3,typeof(Info_Test));

Итак. теперь у меня есть копия первой из двух структур, но не второй?

Как правильно вызвать эту функцию, чтобы получить массив структур (все 2 в этом случае), а не только первый?

Спасибо за любую помощь, Митч.

...