Подтвердить что ты не робот

Каковы наилучшие методы использования SWIG с С#?

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

Изменить: некоторые уточнения на целевых ОС.

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

4b9b3361

Ответ 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