Это потому, что List
еще не выделено.
Вам нужно будет инициализировать все поля.
Другая проблема, которую я вижу, заключается в следующем:
IntPtr uList = Marshal.AllocHGlobal(Marshal.SizeOf(userList));
...
result = GetUsers(out uList);
Вы уверены, что out
не должно быть ref
? Иначе нет никакого смысла (не уверен, если ref
также правильный).
Обновление: Глядя на ваш код еще раз, вы должны делать это (и избегать этой утечки памяти в глаза).
IntPtr uList;
var result = GetUsers(out uList);
var userlist = (USER_LIST) Marshal.PtrToStructure(ulist, typeof(USER_LIST));
Marshal.FreeHGlobal(ulist); // pray here or shoot the author of the C function
Обновите снова:
Ваша подпись p / invoke, вероятно, неверна, или вы неправильно ее интерпретируете.
Я могу догадаться, что-то вроде:
int GetUsers(USER_LIST* ulist);
А то, что у вас есть, не одно и то же.
Если это так, решение легко.
Измените USER_LIST
на класс (но сохраняйте последовательное расположение) и используйте
// pinvoke sig
int GetUsers(USER_LIST ulist);
var ulist = new USER_LIST();
// initialize fields
var r = GetUsers(ulist);
- или -
Позвоните по ref
.
// pinvoke sig
int GetUsers(ref USER_LIST ulist);
var ulist = new USER_LIST();
// initialize fields
var r = GetUsers(ref ulist);
Таким образом, вам не нужно возиться с ручной сортировкой, и я больше не вижу возможности утечек памяти.
Окончательное обновление:
С учетом подписи, которую вы опубликовали, похоже, что GetUsers
возвращает указатель на список USER_LIST
с возвращаемым значением, равным счетчику. Хорошая утечка памяти там.
В любом случае, я бы, вероятно, поэкспериментировал с небезопасным подходом здесь, и просто проанализировал результат и убедился, что все освободилось. (Я все еще думаю, что вы должны застрелить автора).