Как использовать библиотеку С++ в приложении С#?
До сих пор я понял, что мне нужно перекомпилировать библиотеку как .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 - это то, что вам нужно, чтобы сделать это с наименьшими усилиями.