Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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).