Использование библиотеки DLL С++ в приложении С#
У меня есть неуправляемая С++ DLL, которая просто экспортирует один класс (а не COM... это просто класс С++) в качестве своего интерфейса. Я хочу использовать этот класс в С#, но мне сказали, что его нельзя просто импортировать в С#.
Каков правильный способ использования этого класса в моем приложении С#?
Ответы
Ответ 1
Простой способ, предполагающий класс Foo:
- Создайте проект С++/CLI, вызовите этот FooWrapper.
- Сделать FooWrapper зависеть от неуправляемой dll (как вы обычно это делали).
- Создайте управляемый класс ManagedFoo, который содержит одно частное поле экземпляра типа Foo *.
- предоставляют функции общего переноса в ManagedFoo, которые пересылаются в поле основного экземпляра.
- Необязательно (хотя рекомендуется):
- конвертировать параметры из .net-идиом (строк и т.п.) в идиомы С++ (std::string или char *)
- поймать неуправляемые исключения и бросить управляемые вместо них
Затем вы делаете свой код С# зависимым от проекта /dll FooWrapper и убедитесь, что неуправляемый ll правильно развернут с ним, как это делается, зависит от неуправляемой dll, но в том же каталоге обычно достаточно.
Если функции не полагаются на экземпляры класса, то даже проще это P/Invoke
Ответ 2
Этот ответ может быть излишним для одной библиотеки классов, но SWIG является хорошим решением для "обертывания" классов C/С++ для использования с других языков. Он хорошо работает с С#.
См. http://www.swig.org/.
Ответ 3
DllImport - ваш лучший выбор. Существует масса массивов данных, особенно если вы передаете структуры, но вы можете делать с ним что угодно.
Ответ 4
Для преодоления управляемой/неуправляемой границы вам нужен посредник прокси (GoF pattern).
Два варианта:
- Обертка С++/CLI
- Оболочка COM.
Первый будет более прямым, а второй - чистым С++ → COM → .NET.
Ответ 5
Иногда проще обеспечить свой собственный интерфейс C. SWIG является нетривиальным для настройки. Я использую управляемые С++ и С++/CLI, и они в порядке. Самый простой - это просто сделать оболочку C (и может использоваться любым другим языком, поскольку большинство из них имеют способ вызвать функцию C).