Обеспечение доступности библиотеки C ++ для .Net - PullRequest
2 голосов
/ 12 марта 2009

Мне нужно сделать большую библиотеку c ++ доступной для использования на языках .Net, таких как C #.

Библиотека содержит большое количество классов, которые можно разбить на две группы. Классы с подсчетом ссылок, которые реализуют абстрактный класс IRefCounting и используют фабричный метод для их создания, и просто простые классы, использующие new / delete.

В объявлении есть много простых функций.

Изначально я собирался написать классы-обёртки для всего на c ++ / clr. Однако желательно, чтобы полученные библиотеки-обертки работали на Mono. Перекомпиляция библиотеки и оболочки для каждой платформы - это хорошо, однако проблема в том, что кажется, что c ++ / clr может ориентироваться только на окна, поскольку для него нет компилятора, предназначенного для других платформ, и, следовательно, код оболочки не будет работать на других паттернах. ..

Есть ли что-то, что я здесь упустил (например, как запустить c ++ / clr для руководства по платформе x) или есть альтернативный способ сделать все функции, структуры и классы c ++ доступными для C #?

РЕДАКТИРОВАТЬ: Под доступным я подразумеваю доступное для использования, например, скажем, в моей c ++ lib у меня было

//namespace maths{
class Vector2
{
public:
    float x,y;
    Vector2();
    Vector2(const Vector&);
    Vector2(float x, float y);
    float Dot();
    //operators
    ...
};

Тогда в C # id хотелось бы использовать его как обычный класс, например

maths::Vector2 a = new maths::Vector2(5, 5);
maths::Vector2 b = new maths::Vector2(1, 10);
b *= 3
maths::Vector2 c = a + b;
//c.x == 8, c.y == 35

Кроме того, как бы я это ни делал, я не могу редактировать библиотеку c ++, все должно быть сделано как обертка вокруг существующих классов и функций.

Ответы [ 3 ]

3 голосов
/ 12 марта 2009

Оболочки C ++ / CLI - определенно лучший вариант, если вы ориентируетесь только на Windows. Они работают очень хорошо, их очень легко писать и поддерживать и т. Д. Но, как вы сказали, это не сработает на Mono. Проблема заключается в том, что создаваемая сборка - это не сборка clr: pure, а сборка, в которой смешан собственный и IL-код, поэтому она не будет работать за пределами Windows. Кроме того, вам нужно создать отдельные сборки в C ++ / CLI для целей x86 и x64, если вы собираетесь использовать 64-битные системы.

SWIG, безусловно, вариант. Он может справиться со всеми сложностями обёртывания класса C ++, но когда вы переходите к более сложным проблемам, вам, как правило, приходится вносить некоторые изменения.

Я бы порекомендовал проверить основной сайт SWIG , и особенно их раздел C #.

Для хороших примеров использования SWIG для упаковки очень сложной библиотеки, посмотрите OGRE Dot Net (почти мертвый, но все еще хороший пример) или GDAL . Из того, что я помню, оба имеют специальную обработку для специфических функций C # и обрабатывают подсчитанные классы ссылок, перечисления и т. Д.

Еще одна приятная вещь о SWIG - если вы делаете обертки SWIG, очень легко распространить ее на другие языки, если вам когда-нибудь понадобится. Если у вас есть обертки, сделать обертки Java, python, ruby ​​и т. Д. Очень просто.

1 голос
/ 12 марта 2009

Я использовал SWIG , чтобы обернуть некоторый код C ++ и вызвать его из моно отлично.

0 голосов
/ 12 марта 2009

Если, делая доступным, вы имеете в виду сделать доступным для редактирования, вы можете реализовать систему отражения на основе шаблонов / макросов в C ++ и построить оболочку для C # и Mono поверх этого. Для идеи о том, как реализовать это, вы можете взглянуть на

DECLARE_DYNAMIC

и

RUNTIME_CLASS

макросы в MFC и

ICustomTypeDescriptor

интерфейс в C #.

Эту тему также освещают в некоторых книгах серии Gem для программирования игр.

Если, с другой стороны, вы имеете в виду сделать доступным для программирования, вам, безусловно, придется предоставить программисту все типы, с которыми он должен работать, то есть вы должны обернуть их.

Насколько я понимаю, Mono - это виртуальная машина, способная выполнять байт-код, созданный CLR (и другими), поэтому двоичные файлы C # - все, что вам нужно.

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