Как использовать библиотеку С++ в приложении С#?

До сих пор я понял, что мне нужно перекомпилировать библиотеку как .dll вместо .lib, включить /clr и /EHa вместо /EHsc. Теперь у меня есть управляемая dll, которую я добавил в качестве ссылки в моем проекте С#.

Теперь, как я могу его использовать?

Я готов написать некоторые обертки, но я не знаю, с чего начать или как "видеть", к каким функциям я получил доступ. Я немного ознакомился с тем, как компилятор может искажать имена и функции классов... мне нужно вернуться и добавить __declspec экспорт везде (если да, как?) Или есть опция в VS2010, который говорит: "Не ругайте!"?

Библиотека С++, находящаяся под вопросом, все еще находится в активной разработке, поэтому я надеюсь, что смогу немного изменить библиотеку С++ и просто перекомпилировать ее с помощью нескольких коммутаторов, а затем выставить новую функциональность по мере необходимости.

Ответ 1

Если вы собираетесь скомпилировать свой С++ (если первоначально был неуправляемый С++), вам нужно будет сделать гораздо больше, чем просто добавить ключ /clr. Для того чтобы С# использовать DLL, вам необходимо создать управляемые классы и другие типы на основе CTS, которые совместимы с С# (.NET).

См. разделы и ref.

Хорошая книга, чтобы прочитать о предмете (IMHO), это один

Ответ 2

Вы можете либо выставить функции как функции стиля C (т.е. никакие искажения) из вашей DLL, либо вы можете представить их как COM-объекты.

Ответ 3

Я бы предложил написать COM-обертку и использовать ее вместо этого. Посмотрите http://msdn.microsoft.com/en-us/library/035x3kbh%28v=VS.80%29.aspx для инструкций ввода. Вы хотите, чтобы ваши интерфейсы объектов были получены из IDispatch и были совместимы с автоматизацией, что должно позволить среде выполнения использовать их без какого-либо произвольного маршалинга.

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

Это мое предложение, во всяком случае.

Ответ 4

Да, заверните его в COM-объект. Я считаю, что ATL - это то, что вам нужно, чтобы сделать это с наименьшими усилиями.