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

StackOverflow https://stackoverflow.com/questions/25268

  •  09-06-2019
  •  | 
  •  

Вопрос

Кто-нибудь из присутствующих использовал СВИГ библиотека с 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, я бы посоветовал не беспокоиться ни о чем из вышеперечисленного, а просто использовать П/вызов

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top