Каковы наилучшие методы использования SWIG с C#?
Вопрос
Кто-нибудь из присутствующих использовал СВИГ библиотека с C#?Если да, то какие подводные камни вы обнаружили и как лучше всего использовать библиотеку?Я подумываю использовать его в качестве оболочки для программы, написанной на C, и хочу обернуть файлы заголовков так, чтобы я мог использовать их в своем приложении .NET.
Редактировать:Некоторые разъяснения по целевым ОС.Я планирую запустить приложение в Linux и Windows, поэтому я изучаю SWIG.P/Invoke не является вариантом.
Решение
Я думаю, что ошибка, которую допустили предыдущие авторы, заключалась в том, что они читали документацию, а не смотрели примеры.
Несколько часов назад мне нужно было связать некоторые классы C++ с C#.Я заглянул в свой каталог Swig (он у меня уже был для другой работы), нашел каталог Examples/csharp/class
, просмотрел код, загрузил решение, просмотрел его, скопировал, вставил свой код, все сработало, моя работа была выполнена.
С учетом сказанного, сгенерированный код P/Invoke не является решением для всех нужд.В зависимости от вашего проекта может быть так же просто написать несколько простых оболочек API самостоятельно или написать управляемый C++ (отличный пример этого можно найти в SlimDX).
Для моих нужд это было просто и легко - у меня было mystuff.dll
, и теперь дополнительно могу отправить mystuffnet.dll
.Я согласен, что в этот документ сложно попасть.
Редактировать:Я заметил, что ОП упомянул только C.Для этого вам не нужен Swig, просто используйте обычный синтаксис взаимодействия C#/C DLLImport.Swig становится полезным, когда вы хотите, чтобы классы С++ вызываться из 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, поэтому, если у вас возникнут проблемы с этим, вам нужно будет найти другое решение.
Если вы используете типы, которые отличаются от обычных (void, структуры и т. д.), вам придется проделать некоторую дополнительную работу, чтобы сделать все правильно, но для обычного API, использующего int, char* и т. д., это нормально.
Несколько лет назад я пытался использовать SWIG для создания оболочки проекта C++ для использования в .NET.
Я не продвинулся далеко, так как создание конфигурации, необходимой для SWIG, было огромным трудом.В то время я просто хотел найти решение, а не изучать другой язык/API/и т. д.В наши дни SWIG может быть проще в использовании, я не могу вам сказать.
В итоге мы использовали Managed C++ для оболочки проекта C++.Это сработало очень хорошо.
Если вы просто вызываете функции прямо из dll, я бы посоветовал не беспокоиться ни о чем из вышеперечисленного, а просто использовать П/вызов