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

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

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

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

3 ответов


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

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

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

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

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


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

%module mdProject

%{
#include "mdProject.h"
%}

я скомпилировал его в глотке с:

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

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

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

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


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

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

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

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