2009-03-12 6 views
2

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

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

В adittion есть много простых функций.

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

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

EDIT: К комплекту я имею в виду доступен для использования, например, сказать, в моем C++ Lib я имел

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

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

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

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

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

Я рекомендую проверить SWIG main site, и особенно их C# section.

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

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

0

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

DECLARE_DYNAMIC

и

RUNTIME_CLASS

макросы в MFC и

ICustomTypeDescriptor

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

Некоторые книги в серии «Программирование игр» также охватывают эту тему.

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

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

+0

Я не знаю, как C# напрямую использовать классы C++ в статических и динамических библиотеках, а также многие, реализованные непосредственно в файлах заголовков. Вот почему я собирался использовать C++/clr, так как он может использовать unmanged C++ и предоставить интерфейс для использования C#. Однако, похоже, это ограничено окнами ... –

1

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

+0

Похоже, что это жизнеспособное решение, просто некоторые вещи, которые я действительно не вижу, хорошо объясняют, что может вызвать проблемы для меня: –

+0

Может ли он понять, что подсчет очков подсчитали классы C++, увеличивая и уменьшая рецензия? Я хотел бы, чтобы это помогло здесь, например, если указатель на объект, подсчитанный ref (принадлежит, чтобы уменьшить счетчик вниз) или borrwed (необходимо увеличить ref, если он сохраняет объект). –

+0

И есть ли какая-то информация о конвертации для определенных типов. Например, std :: basic_string закодирован в utf-16 во всей моей библиотеке, поэтому он должен обеспечить правильную кодировку строки, которая входит и выходит. –

Смежные вопросы