Могу ли я попросить помощи относительно следующего?
У меня есть функция в 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 в этом случае), а не только первый?
Спасибо за любую помощь, Митч.