Каковы наилучшие методы использования SWIG с С#?
Кто-нибудь там использовал библиотеку SWIG с С#? Если у вас есть, какие подводные камни вы нашли и как лучше всего использовать библиотеку? Я думаю об использовании его в качестве оболочки для программы, написанной на C, и я хочу обернуть файлы заголовков, где я могу использовать их в своем приложении .NET.
Изменить: некоторые уточнения на целевых ОС.
Я планирую запустить приложение в Linux и Windows, поэтому я рассматриваю SWIG. P/Invoke не является вариантом.
Ответы
Ответ 1
Я думаю, что ошибка, которую сделали предыдущие плакаты, была прочитана документами и не смотрела на примеры.
Несколько часов назад мне нужно было связать некоторые классы С++ с С#. Я заглянул в свой Swig dir (у меня уже было это для другой работы), нашел каталог Examples/csharp/class
, просмотрел код, загрузил решение, собрал его, скопировал, поместил в свой код, он работал, моя работа была выполнена.
С учетом сказанного генерируемый код P/Invoke не является решением для всех потребностей. В зависимости от вашего проекта, может быть так же просто написать некоторые простые обертки API самостоятельно или написать управляемый С++ (посмотрите на SlimDX для превосходного примера).
Для моих нужд это было просто и легко - у меня было mystuff.dll
, и теперь я могу отправить mystuffnet.dll
. Я соглашусь, что документ трудно попасть.
Изменить: я заметил, что OP только упоминается C. Для этого вам действительно не нужен Swig, просто используйте обычный синтаксис взаимодействия С#/C DLLImport. Swig становится полезным, если вы хотите вывести С++ классы из С#.
Ответ 2
Для моего последнего проекта здесь весь файл конфигурации CIG SWIG:
%module mdProject
%{
#include "mdProject.h"
%}
Я скомпилировал его в SWIG с помощью:
swig -csharp -c++ -I../../Include mdProject.i
Это сгенерировало Project.cxx, который я скомпилировал и связал непосредственно в "основной" DLL, поэтому мне не понадобилась вторая С++ "helper" DLL. SWIG также создал кучу файлов С#, которые я скомпилировал в .NET DLL. Мои другие оболочки (Java, PHP и т.д.) Используют вспомогательную DLL.
Как упоминалось в @patrick, SWIG использует P/Invoke, поэтому, если у вас есть проблема с этим, вам нужно найти другое решение.
Если вы используете типы, которые отклоняются от обычных (пустоты, структуры и т.д.), вам нужно будет сделать некоторую дополнительную работу, чтобы исправить это, но для среднего API с использованием int, char * и т.д. это нормально.
Ответ 3
Я попытался использовать SWIG для переноса проекта С++ для использования в .NET несколько лет назад.
Я не зашел так далеко, потому что это была огромная гигантская боль, чтобы создать конфигурацию, которая требуется SWIG. В то время я просто хотел найти решение, а не изучать другой язык /api/etc. SWIG может быть проще использовать в наши дни, я не мог сказать вам.
Мы закончили использование Managed С++ для переноса проекта С++. Он работал очень хорошо.
Если вы просто вызываете функции прямо из dll, я бы посоветовал не беспокоиться ни о одном из вышеперечисленных, а просто использовать P/Invoke