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

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

Edit: Some clarification on target OS's.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
0
9 153
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

Ответ принят как подходящий

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

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

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

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

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

Я считаю, что SWIG крутой даже для C. Вы можете превратить процедурное программирование в упор!

Matthias 23.12.2011 16:56

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

Я знаю, что это было в прошлом году ... но не могли бы вы рассказать, как вы "скомпилировали и связали непосредственно с" основной "DLL" сгенерированный файл .cxx? Я совершенно не понимаю, как вы это делаете. Заранее спасибо! :)

Ozzie Perez 26.11.2010 10:46

Вам понадобится исходный код для «основной» DLL (в моем случае C++). Я только что открыл проект C++ DLL, добавил в проект автоматически сгенерированный файл C++ SWIG и перестроил. Если у вас нет доступа к источнику DLL, вы не сможете этого сделать. Другими словами, вы не можете постепенно добавлять новый исходный файл к существующей DLL - все это должно быть снова построено с нуля с добавлением нового исходного файла. Часто у вас нет доступа к источнику, поэтому вам приходится создавать небольшую «промежуточную» DLL между вашим кодом C# и DLL.

Marc Bernier 29.11.2010 18:35

Другие вопросы по теме