Кто-нибудь использовал библиотеку SWIG с C#? Если да, то какие подводные камни вы обнаружили и как лучше всего использовать библиотеку? Я думаю об использовании его в качестве оболочки для программы, написанной на C, и я хочу обернуть файлы заголовков, чтобы я мог использовать их в своем приложении .NET.
Edit: Some clarification on target OS's.Я планирую запускать приложение в Linux и Windows, поэтому я ищу SWIG. P / Invoke не подходит.





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