Использование библиотеки DLL C ++ в приложении C #

У меня есть неуправляемая C ++ DLL, которая просто экспортирует один class (а не COM … это просто class C ++) в качестве своего интерфейса. Я хочу использовать этот class в C #, но мне сказали, что его нельзя просто импортировать в C #.

Каков правильный способ использования этого classа в моем приложении C #?

Простой способ, предполагающий class Foo:

  1. Создайте проект C ++ / CLI, вызовите этот FooWrapper.
  2. Сделать FooWrapper зависеть от неуправляемой dll (как вы обычно это делали).
  3. Создайте управляемый class ManagedFoo, который содержит одно частное поле экземпляра типа Foo *.
  4. предоставлять публичные функции обертывания в ManagedFoo, которые передаются в поле основного экземпляра.
  5. Необязательно (хотя рекомендуется):
    • конвертировать параметры из .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).

Давайте будем гением компьютера.