Использование C ++ Class DLL в приложении C # - PullRequest
46 голосов
/ 20 февраля 2009

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

Как правильно использовать этот класс в моем приложении на C #?

Ответы [ 5 ]

44 голосов
/ 20 февраля 2009

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

  1. Создайте проект C ++ / CLI, назовите его FooWrapper.
  2. Заставьте FooWrapper зависеть от неуправляемой dll (как вы обычно это делаете).
  3. Создайте управляемый класс ManagedFoo, который содержит одно поле частного экземпляра типа Foo *.
  4. предоставляет общедоступные функции переноса в ManagedFoo, которые пересылаются в базовое поле экземпляра.
  5. Опционально (хотя и рекомендуется):
    • преобразование параметров из .net идиом (строк и т.п.) в идиомы C ++ (std :: string или char *)
    • ловит неуправляемые исключения и вместо них выбрасывает управляемые

Затем вы делаете свой код c # зависимым от проекта / dll FooWrapper и гарантируете, что неуправляемая dll правильно развернута с ним, как это делается, зависит от неуправляемой dll, но в том же каталоге обычно достаточно.

Если функции не зависят от экземпляров класса, тогда еще проще использовать P / Invoke

8 голосов
/ 20 февраля 2009

Этот ответ может быть излишним для одной библиотеки классов, но SWIG является хорошим решением для "обертывания" классов C / C ++ для использования из других языков. Хорошо работает с C #.

См. http://www.swig.org/.

3 голосов
/ 20 февраля 2009

DllImport - ваш лучший выбор. Существует небольшая масса типов данных, особенно если вы передаете структуры, но вы можете делать с ней практически все.

2 голосов
/ 21 февраля 2009

Иногда проще предоставить свой собственный C-интерфейс. SWIG нетривиально настроить. Я использовал управляемые C ++ и C ++ / CLI, и они в порядке. Самым простым было просто сделать обертку C (и может использоваться любым другим языком, так как у большинства есть способ вызвать функцию C).

2 голосов
/ 20 февраля 2009

Вам нужен посредник (шаблон GoF), чтобы соединить управляемую / неуправляемую границу.

Два варианта:

  • Оболочка C ++ / CLI
  • Оболочка COM.

Первый будет более прямым, а второй имеет два шага чистого C ++ -> COM -> .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...