Использование библиотеки DLL C ++ в приложении C #
У меня есть неуправляемая C ++ DLL, которая просто экспортирует один class (а не COM … это просто class C ++) в качестве своего интерфейса. Я хочу использовать этот class в C #, но мне сказали, что его нельзя просто импортировать в C #.
Каков правильный способ использования этого classа в моем приложении C #?
- Неуправляемые DLL не загружаются на сервере ASP.NET
- вызов управляемого кода из неуправляемого кода
- Вызов функции PInvoke '' не сбалансировал стек
- Внедрение неуправляемой dll в управляемую C # dll
- Разница между управляемым и неуправляемым in-app продуктом Android?
Простой способ, предполагающий class Foo:
- Создайте проект C ++ / CLI, вызовите этот FooWrapper.
- Сделать FooWrapper зависеть от неуправляемой dll (как вы обычно это делали).
- Создайте управляемый class ManagedFoo, который содержит одно частное поле экземпляра типа Foo *.
- предоставлять публичные функции обертывания в ManagedFoo, которые передаются в поле основного экземпляра.
- Необязательно (хотя рекомендуется):
- конвертировать параметры из .net-идиом (строки и т. п.) в идиомы C ++ (std :: string или char *)
- улавливать неуправляемые исключения и вместо этого бросать управляемые
Затем вы делаете свой код c # зависеть от проекта / dll FooWrapper и убедитесь, что неуправляемая dll правильно установлена с ним, как это делается, зависит от неуправляемой dll, но в том же каталоге обычно достаточно.
Если функции не полагаются на экземпляры classа, то даже проще это P / Invoke
Этот ответ может быть излишним для одной библиотеки classов, но SWIG является хорошим решением для «обертывания» classов C / C ++ для использования с других языков. Он хорошо работает с C #.
См. http://www.swig.org/ .
DllImport – ваш лучший выбор. Существует масса массивов данных, особенно если вы передаете структуры, но вы можете делать с ней что угодно.
Для преодоления управляемой / неуправляемой границы вам нужен посредник прокси (GoF pattern).
Два варианта:
- Обертка C ++ / CLI
- Оболочка COM.
Первый будет более прямым, а второй – чистым C ++ -> COM -> .NET.
Иногда проще предоставить свой собственный интерфейс C. SWIG нетривиальна для настройки. Я использую управляемые C ++ и C ++ / CLI, и они в порядке. Самый простой – это просто сделать C-оболочку (и ее можно использовать любым другим языком, поскольку большинство из них имеют способ вызвать функцию C).