Маршалинг массивов строк в p/inkove
От: 0x7be СССР  
Дата: 04.05.09 11:26
Оценка:
Добрый день.
Есть вопрос. Может быть такое уже обсуждалось, но поиск не работает
Дело в следующем: есть набор достаточно развесистых вложенных по значению нативных структур, в одной которых встречается передача массива строк через указатель типа wchar_t**. Мне необходимо описать эти структуры в С#-коде так, что бы они успешно маршалились на своих нативные прообразы.

Поясню свои слова кодом:
Нативная структура со строками имеет вид:

struct StringArray
{
  int count;
  wchar_t ** data;
}


Что бы отмаршаллить в неё данные, я завожу структуру вида

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct StringArray
{
  public int Count;
  public string[] data;
}

Делаю я это в надежде, что поле string[] data преобразуется в wchar_t** data, как это имеет место при маршаллинге параметров в нативные функции. Но не тут-то было! Массив строк маршаллится в SafeArray либо в ByValArray, что никак не подходит. Попытка написать кастомный маршаллер для string[] и применить его тут не удаётся — рантайм ругается, что для массивов возможны только значения UnmanagedType.ByValArray или UnmanagedType.SafeArray.
Попытка написать кастомный маршаллер для структуре StringArray целиком тоже обламывается — эта структура используется для определения поля другой структуры, а CustomMarshaller для полей структур запрещён. Остаётся только ручками написать кастомных маршаллер для всего дерева структур. Этого хотелось бы избежать.
Какие есть ещё возможности отмаршалить string[], являющийся полем структуры, в wchar_t**?
Заранее спасибо.

P.S. Нативный код менять нельзя — он не мой.
int
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.