Я имею дело с набором встроенных функций, которые возвращают данные через динамически распределяемые массивы. Функции принимают в качестве входных данных указатель ссылки, а затем указывают его на результирующий массив.
Например:
typedef struct result
{
//..Some Members..//
}
int extern WINAPI getInfo(result**);
После вызова 'result' указывает на завершенный нулем массив результатов *.
Я хочу создать управляемый список из этого неуправляемого массива. Я могу сделать следующее:
struct Result
{
//..The Same Members..//
}
public static unsafe List<Result> getManagedResultList(Result** unmanagedArray)
{
List<Result> resultList = new List<Result>();
while (*unmanagedArray != null)
{
resultList.Add(**unmanagedArray);
++unmanaged;
}
return result;
}
Это работает, будет утомительно и безобразно переопределять каждый тип структуры, с которой мне придется иметь дело (~ 35). Я хотел бы решение, которое является общим для типа структуры в массиве. С этой целью я попытался:
public static unsafe List<T> unmanagedArrToList<T>(T** unmanagedArray)
{
List<T> result = new List<T>();
while (*unmanagedArray != null)
{
result.Add((**unmanagedArray));
++unmanagedArray;
}
return result;
}
Но это не скомпилируется, потому что вы не можете "взять адрес, получить размер или объявить указатель на управляемый тип ('T')".
Я также пытался сделать это без использования небезопасного кода, но столкнулся с проблемой, что Marshal.Copy () должен знать размер неуправляемого массива. Я мог определить это только с помощью небезопасного кода, поэтому использование Marshal.Copy () в этом случае не принесло никакой пользы.
Чего мне не хватает? Может ли кто-нибудь предложить общий подход к этой проблеме?