Получение функциональности объекта из кода C ++ в C # - PullRequest
2 голосов
/ 17 апреля 2009

У меня есть функция write в C ++, которая вызывает некоторые функции из старой библиотеки. Эта функция создает некоторую память, совершает звонки и уничтожает память. Чтобы оптимизировать это, я создал бы объект, который сохранял бы выделенную память, пока объект не был уничтожен. Однако я собираюсь вызывать эту функцию из C # и не верю, что могу экспортировать класс, только функции или переменные.

Моя идея вместо этого; Думайте о DLL как о классе и используйте локальные переменные внутри области dll, чтобы указывать на память. Затем создайте функцию для создания памяти, вызовите рабочие функции, а другую - для уничтожения памяти, когда закончите работу с DLL.

Это хороший подход? Есть ли лучший способ?

Ответы [ 4 ]

2 голосов
/ 18 апреля 2009

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

Редактировать Только что заметил ваш комментарий " Однако я собираюсь вызывать эту функцию из C # и не верю, что могу экспортировать класс, только функции или переменные. "

Это не совсем так - C # может импортировать полные классы из сборки, сгенерированной из кода C ++ / CLI.

1 голос
/ 18 апреля 2009
1 голос
/ 18 апреля 2009

Если вы хотите изменить собственный код C ++, вы всегда можете экспортировать его как интерфейс COM, который может использовать C #.

1 голос
/ 18 апреля 2009

Создайте класс C #, который реализует IDisposable. Вы можете обернуть простой C API вокруг вашего объекта C ++, поэтому при создании экземпляра он возвращает указатель на класс C ++, а когда вы Dispose () вашего класса C #, он удаляет указатель.

Вы всегда можете разыменовать этот указатель для вызова методов в вашем классе C ++.

Еще одна хорошая альтернатива - просто использовать C ++ / CLI для создания оболочки для вашего класса C ++. Обработка ситуации такого типа намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...