Каковы лучшие практики при использовании SWIG с C #? - PullRequest
17 голосов
/ 24 августа 2008

Кто-нибудь использовал библиотеку SWIG с C #? Если да, какие подводные камни вы нашли и как лучше всего использовать библиотеку? Я подумываю использовать его в качестве оболочки для программы, написанной на C, и хочу обернуть файлы заголовков, чтобы использовать их в своем приложении .NET. Изменить: некоторые разъяснения по целевой ОС.

Я планирую запустить приложение в Linux и Windows, поэтому я смотрю на SWIG. P / Invoke не вариант.

Ответы [ 3 ]

14 голосов
/ 01 июля 2009

Для моего последнего проекта, вот весь файл конфигурации C # SWIG:

%module mdProject

%{
#include "mdProject.h"
%}

Я скомпилировал его в SWIG с:

swig -csharp -c++ -I../../Include mdProject.i

Это сгенерировало Project.cxx, который я скомпилировал и связал непосредственно с «основной» DLL, поэтому мне не понадобилась вторая C ++ «вспомогательная» DLL. SWIG также сгенерировал кучу файлов C #, которые я скомпилировал в .NET DLL. Мои другие оболочки (Java, PHP и т. Д.) Используют вспомогательную DLL.

Как упомянул @patrick, SWIG использует P / Invoke, поэтому, если у вас возникла проблема с этим, вам нужно будет найти другое решение.

Если вы используете типы, отклоняющиеся от обычных (пустоты, структуры и т. Д.), Вам придется проделать дополнительную работу, чтобы сделать это правильно, но для среднего API с использованием int, char * и т. Д. Это нормально.

8 голосов
/ 01 июля 2009

Я думаю, что ошибка, которую сделали предыдущие постеры, заключалась в том, что они читали документы, а не смотрели примеры.

Несколько часов назад мне нужно было связать некоторые классы C ++ с C #. Я заглянул в мой каталог Swig (он у меня уже был для другой работы), нашел каталог Examples/csharp/class, просмотрел код, загрузил решение, взломал его, скопировал его, вставил в мой код, он работал, моя работа была выполнена.

С учетом сказанного, сгенерированный код P / Invoke не является решением для всех нужд. В зависимости от вашего проекта может быть так же просто написать несколько простых программных оболочек API или написать управляемый C ++ (посмотрите превосходный пример этого в SlimDX).

Для моих нужд это было просто и легко - у меня было mystuff.dll, а теперь дополнительно я могу отправить mystuffnet.dll. Я согласен, что в документ трудно попасть.

Edit: я заметил, что OP упоминал только C. Для этого вам не нужен Swig, просто используйте обычный синтаксис взаимодействия CI / C DLLImport . Swig становится полезным, когда вы хотите, чтобы C ++ классы вызывались из C #.

5 голосов
/ 26 августа 2008

Я пытался использовать SWIG, чтобы обернуть проект C ++ для использования в .NET несколько лет назад.

Я не очень далеко продвинулся, потому что было огромной болью произвести конфигурацию, которая требовалась SWIG. В то время я просто хотел найти решение, а не изучать другой язык / API / и т.д. SWIG может быть проще в использовании, я не могу вам сказать.

В итоге мы использовали Managed C ++ для упаковки проекта C ++. Это сработало очень хорошо.

Если вы просто вызываете функции прямо из dll, я бы посоветовал не беспокоиться ни об одном из вышеперечисленных, а просто использовать P / Invoke

...