Обертывание неуправляемой библиотеки классов C ++ с C ++ / CLI - Вопрос 2 - Коллекции - PullRequest
6 голосов
/ 27 января 2011

Примечание: Это сообщение представляет Вопрос № 2 моего запроса. Вводный блок (весь текст до тех пор, пока не будут достигнуты цифры) повторяется в обоих вопросах, поскольку для ответа на вопрос может потребоваться дополнительная информация.


Введение в вопрос

У меня есть неуправляемая библиотека C ++, которая содержит классы и функции, которые являются общими для нескольких библиотек «более высокого уровня» и совместно используются ими. Теперь мне нужно предоставить доступ к общей библиотеке для приложений C # / .Net. Для этого мне придется обернуть общую библиотеку классами-обертками C ++ / CLI.

Классы, содержащиеся в общей библиотеке, могут быть сложными классами, содержащими вложенные определения классов и переменные-члены, которые являются коллекциями других объектов классов. Переменные коллекции - это экземпляры typedef пользовательского класса списка для управления коллекцией. Общая библиотека также включает в себя классы, которые представляют синтаксическую структуру синтаксиса нестандартного файла сценария, созданного с использованием FLEX / BISON. Общая библиотека и библиотеки «более высокого уровня» написаны таким образом, который допускает кросс-платформенную (Linux и GCC) компиляцию и использование. Любые изменения, которые я делаю, должны допускать это.

Классы-оболочки C ++ / CLI сначала должны иметь только возможность чтения. Но по мере продвижения проекта мне в конечном итоге понадобится создавать и изменять объекты.

Я знаю C ++ / CLI и создал несколько оболочек для других неуправляемых проектов C / C ++, а также предоставляю абстрактные функциональные возможности для этой же общей библиотеки. Так что у меня уже есть основы (и некоторые дополнительные знания).

У меня есть два вопроса, связанных с выполнением этой задачи, и, поскольку они оба могли порождать свои собственные обсуждения и решения, я разделяю свои вопросы на отдельные посты. Я включу ссылку на другой вопрос в каждом сообщении.


Актуальные вопросы

  1. Упаковка неуправляемой библиотеки классов C ++ с C ++ / CLI - Вопрос 1 - Организация проекта / кода

  2. Как эффективно обернуть / обработать переменные коллекции в неуправляемых классах?

    • Объекты коллекции - это typedefs пользовательского класса списка шаблонов (CObjectList<T>), написанные для управления управлением коллекцией указателей объектов. Класс коллекции обеспечивает все основные функциональные возможности коллекции, а также управление указателями и очистку / освобождение объектов при деконструкции. Так что для CWidget в коде будет typedef CObjectList<CWidget> CWidgetList;.

    • Большинство классов, используемых в параметре шаблона кода и класса коллекции, являются самим классом. Но в некоторых случаях коллекция относится к базовому классу. Это происходит в разобранной структуре для синтаксического анализатора FLEX / BISON. Например, существует класс CCommand, от которого наследуются все остальные доступные команды. Так что будет CSetCommand, CPrintCommand, CIfCommand и т. Д.

    • Я думаю, чтобы сделать это, мне нужно будет создать класс-оболочку моей коллекции, которая будет поддерживать отдельные списки для неуправляемых классов и классов C ++ / CLI. Внутренний объект коллекции будет управлять неуправляемым объектом, и для хранения класса-обертки для элемента должен быть управляемый объект коллекции / списка.

    • Есть ли у кого-нибудь примеры / предложения, как это сделать? Или как написать универсальный класс, который может принимать как неуправляемые, так и типы классов C ++ / CLI в качестве параметров?

Ответы [ 2 ]

2 голосов
/ 27 января 2011

У Лу есть отличное предложение , и я согласен с его условиями, когда такой подход хорош.

Если вместо этого коллекции очень большие или часто передаются туда-сюда, вам лучше реализовать перечислимый интерфейс .NET, но не использовать коллекции .NET. По сути, у вас есть обертка коллекции, которой принадлежит собственная коллекция STL, и обертка итератора, которой принадлежит собственный итератор STL. Оболочка коллекции будет реализовывать интерфейс IEnumerable, а GetEnumerator создаст экземпляр оболочки итератора, а оболочка итератора - интерфейс IEnumerator.

Вы хотели бы сделать себя классом, управляемым помощником (вероятно, классом значений), который оборачивает указатель на собственную коллекцию и выполняет подсчет ссылок, как boost::shared_ptr. Используйте нотацию семантики стека, чтобы убедиться, что подсчет ссылок выполняется автоматически при удалении оболочки управляемой коллекции или оболочки итератора.

2 голосов
/ 27 января 2011

Это очень сложный вопрос, но я собираюсь предположить, что у вас есть уровень сортировки / преобразования, который преобразует из управляемых коллекций в неуправляемые. Сохраняйте вашу библиотеку в точности такой, какая она есть, и просто конвертируйте параметры и возвращайте.

Это то, что я бы сделал, если

  1. Коллекции не гигантские
  2. Они не постоянно передаются туда-сюда постоянно.
  3. Вы часто получаете коллекцию в клиентском коде, а затем полностью выполняете несколько вызовов в управляемой стране.

По этим причинам

  1. Слои API упрощают
  2. пересечение неуправляемой / управляемой границы может быть узким местом и должно быть сведено к минимуму

Это будет мой подход по умолчанию, если только мне действительно не понадобится доступ к функциональности библиотеки lib в структуре данных (это были не просто организованные данные - но данные и поведение)

...