Каковы рекомендации по использованию SWIG с C#?

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

Edit: Some clarification on target OS's.

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


person Dale Ragan    schedule 24.08.2008    source источник


Ответы (3)


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

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

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

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

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

person Roark Fan    schedule 01.07.2009
comment
Я думаю, что SWIG крут даже для C. Вы можете превратить процедурное программирование в oop! - person Matthias; 23.12.2011

Для моего последнего проекта вот весь файл конфигурации 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* и т. д., это нормально.

person Marc Bernier    schedule 01.07.2009
comment
Я знаю, что это было в прошлом году.. но не могли бы вы поделиться тем, как вы скомпилировали и связали непосредственно с «основной» DLL сгенерированный файл .cxx? Я совершенно не знаю, как вы это делаете. Заранее спасибо! :) - person Ozzie Perez; 26.11.2010
comment
Вам понадобится исходный код для «основной» DLL (в моем случае C++). Я только что открыл проект DLLs C++, добавил в проект автоматически сгенерированный SWIG файл C++ и пересобрал. Если у вас нет доступа к источнику DLL, вы не можете этого сделать. Другими словами, вы не можете постепенно добавить новый исходный файл в существующую DLL - все это должно быть построено с нуля снова с добавлением нового исходного файла. Часто у вас нет доступа к исходному коду, поэтому вам в конечном итоге приходится создавать небольшую «промежуточную» DLL между вашим кодом C# и DLL. - person Marc Bernier; 29.11.2010

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

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

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

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

person Orion Edwards    schedule 25.08.2008