Каковы лучшие практики при использовании SWIG с C #?

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

Изменить: некоторые разъяснения по целевой ОС.

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

24.08.2008 18:31:54
3 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

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

10
1.07.2009 02:55:07
Я думаю, что SWIG хорош даже для C. Вы можете превратить процедурное программирование в упор!
Matthias 23.12.2011 12:56:31

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

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

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

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

5
25.08.2008 21:57:19

Для моего последнего проекта, вот весь файл конфигурации 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 * и т. Д., Это нормально.

14
1.07.2009 17:49:21
Я знаю, что это было в прошлом году ... но не могли бы вы рассказать о том, как вы "скомпилировали и связали напрямую с" основной "DLL" сгенерированный файл .cxx? Я совершенно не понимаю, как ты это делаешь. Заранее спасибо! :)
Ozzie Perez 26.11.2010 07:46:10
Вы должны иметь исходный код для «основной» DLL (C ++ в моем случае). Я только что открыл проект DLL C ++, добавил автоматически сгенерированный SWIG-файл C ++ в проект и пересобрал его. Если у вас нет доступа к источнику DLL, вы не можете сделать это. Другими словами, вы не можете постепенно добавлять новый исходный файл в существующую DLL-библиотеку - все это должно быть заново создано с добавлением нового исходного файла. Во многих случаях у вас нет доступа к исходному коду, поэтому вам приходится создавать небольшую промежуточную DLL между вашим кодом C # и DLL.
Marc Bernier 29.11.2010 15:35:22