Привязки C # для MEEP (пакет фотонного моделирования) - PullRequest
0 голосов
/ 21 октября 2010

Кто-нибудь знает, как вызвать пакет симуляции Meep MIT из C # (возможно, Mono, боже, помоги мне).

Мы застряли с интерфейсом # $ @% # $ ^ CTL, который является убийцей производительности.Некоторые другие приложения, которые мы интегрируем в наш конвейер sim, находятся на C # (.NET).Я видел Python-интерфейс для Meep (светлые годы впереди CTL), но я бы хотел, чтобы код, который мы разрабатываем, был как можно более однородным.

И, нет, написание остальнойинструменты в Python не вариант.Зачем?Потому что мы ненавидим это.Глупые Баггинсы.Мы ненавидим это навсегда!

(На самом деле, различные цели приложения не поддаются реализации Python, а имеющийся у меня пул талантов гораздо эффективнее с C #.)

Или, в более удобной для SO форме, вопрос:

Существует ли удобный / возможный способ связать библиотеки GNU C ++ с C # в Windows или Mono в Linux?

1 Ответ

0 голосов
/ 21 октября 2010

Простое и переносимое решение - написать оболочку C ++ для libmeep, которая предоставляет C ABI (через extern "C" { ... }), а затем написать оболочку C # вокруг этого API, используя P / Invoke. Это было бы примерно эквивалентно оболочке Python Meep, AFAICT.

Конечно, отображение классов C ++ в классы C # с помощью плоского API C нетривиально - вам нужно будет сохранить дескрипторы IntPtr для классов C ++ в ваших классах C #, правильно реализовать шаблон Dispose, используя GCHandles или словарь IntPtrs для обеспечения ссылочной целостности при обновлении объектов C ++ (при необходимости) и т. д. Подклассирование объектов C ++ в C # и возможность переопределения виртуальных методов становится действительно довольно сложным.

Существует инструмент под названием SWIG, который может сделать это автоматически, но результаты не будут такими же хорошими, как у рукописной оболочки.

Если вы ограничиваетесь Windows / .NET, у Microsoft есть расширенный набор C ++, называемый C ++ / CLI, который позволит вам написать оболочку на C ++, которая напрямую экспортирует .NET API.

...