2008-08-24 3 views
16

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

Редактирование: некоторые уточнения на целевых ОС.

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

ответ

8

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

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

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

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

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

+0

Я думаю, что SWIG классный даже для C. Вы можете превратить процессуальное программирование в oop! – Matthias 2011-12-23 12:56:31

5

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

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

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

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

14

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

%module mdProject 

%{ 
#include "mdProject.h" 
%} 

Я составил его в SWIG с:

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

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

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

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

+0

Я знаю, что это было в прошлом году .. но могли бы вы поделиться тем, как вы «скомпилировали и связали напрямую в« главную »DLL« сгенерированный файл .cxx? Я совершенно не знаю, как вы это делаете. Заранее спасибо! :) – 2010-11-26 07:46:10

Смежные вопросы