Маршалинг массива строк для обугливания ** в C#

Одной вещью, которую большинство (если не все) контейнеры/библиотеки DI приносит Вам, кроме того, является возможность прервать методы для всех экземпляров, созданных через DI.

5
задан aevitas 23 June 2015 в 07:56
поделиться

1 ответ

Лучший способ обозначить неприятные строковые указатели, особенно двойные указатели в структуре, - это просто использовать IntPtr.

public IntPtr mFieldNames;

Это будет Маршал правильно, хотя и не очень полезный тип. Однако, если вы понимаете структуру IntPtr, очень легко получить результирующие строки.

public static List<string> GetAllStrings(IntPtr ptr, int size) {
  var list = new List<string>();
  for ( int i = 0; i < size; i++ ) {
    var strPtr = (IntPtr)Marshal.PtrToStructure(ptr, typeof(IntPtr));
    list.Add(Marshal.PtrToStringUni(strPtr));
    ptr = new IntPtr(ptr.ToInt64()+IntPtr.Size);
  }
  return list;
}

Единственным реальным недостатком является то, что вам придется вручную освобождать память

8
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: