Имам работа с набор от собствени функции, които връщат данни чрез динамично разпределени масиви. Функциите приемат референтен указател като вход, след което го насочват към получения масив.
Например:
typedef struct result
{
//..Some Members..//
}
int extern WINAPI getInfo(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() в този случай.
какво ми липсва Може ли някой да предложи общ подход към този проблем?