Как упорядочить массив структур - (.Net / C # => C ++) - PullRequest
2 голосов
/ 28 августа 2008

Отказ от ответственности: Около нуля с концепциями маршаллинга ..

У меня есть структура B, которая содержит строку + массив структур C. Мне нужно отправить это через гигантскую пропасть взаимодействия потребителю COM - C ++.
Какой набор атрибутов мне нужен для украшения моего определения структуры?

[ComVisible (true)]
[StructLayout(LayoutKind.Sequential)]
public struct A
{
    public string strA
    public B b;
}


[ComVisible (true)]
[StructLayout(LayoutKind.Sequential)]
public struct B
{
    public int Count;

    [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.Struct, SizeParamIndex=0)]
    public C [] c;
}

[ComVisible (true)]
[StructLayout(LayoutKind.Sequential)]
public struct C
{
    public string strVar;
}

редактировать: @Andrew В основном это проблема моих друзей. У него есть эта штука, работающая в .Net - он делает несколько автоматических действий, чтобы создать .tlb / .tlh, который он затем может использовать в области C ++. Беда в том, что он не может исправить размер массива.

Ответы [ 2 ]

4 голосов
/ 29 августа 2008

C ++: самый мощный язык для программирования на .NET Framework

Я собирался приблизиться к проекту, который должен был упорядочить структурированные данные через границу C ++ / C #, но я нашел, что может быть лучше (особенно если вы знаете C ++ и любите изучать новые языки программирования). Если у вас есть доступ к Visual Studio 2005 или выше, вы можете использовать C ++ / CLI, а не маршалинг. По сути, это позволяет вам создать эту волшебную гибридную библиотеку классов .NET / native, которая на 100% совместима с C # (как если бы вы написали все на C # для использования в другом проекте C #), которая также на 100% совместима с C и / или C ++. В вашем случае вы могли бы написать оболочку C ++ / CLI, которая перенаправляла данные из C ++ в памяти в CLI в типах памяти.

Мне очень повезло с этим, я использовал чистый код C ++ для чтения и записи файлов данных (это может быть даже какая-то сторонняя библиотека), а затем мой код C ++ / CLI конвертирует (копирует) Данные C ++ попадают в типы .NET в памяти, которые можно использовать напрямую, как если бы я написал библиотеку чтения / записи в C #. Для меня единственным препятствием был синтаксис, так как вы должны изучить расширения CLI для C ++. Хотелось бы, чтобы у меня был StackOverflow, чтобы задавать вопросы о синтаксисе, еще когда я изучал это!

В обмен на перебор синтаксиса вы изучаете, вероятно, самый мощный язык программирования, который только можно себе представить. Подумайте об этом: элегантность и здравомыслие библиотек C # и .NET, а также низкий уровень совместимости и нативной библиотеки C ++. Вы не захотите писать все свои проекты на C ++ / CLI, но это отлично подходит для передачи данных C ++ в проекты C # / .NET. Это "просто работает".

Учебник

1 голос
/ 28 августа 2008

Ответ зависит от того, какие нативные определения вы пытаетесь собрать. Вы не предоставили достаточно информации, чтобы кто-нибудь смог реально помочь.

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

[MarshalAs (UnmanagedType.ByValTStr, SizeConst = ##)] может быть тем, что вы ищете ...

...