Я просто провел последнюю неделю или около того, выяснив, как выполнить код С++ с С# как часть моей дневной работы. Нам потребовалось бесконечно, чтобы понять это, но окончательное решение довольно просто.
Теперь мне любопытно... Как трудно было бы назвать Haskell с С#? (Обратите внимание: это вызов Haskell из С#, а не наоборот. Таким образом, основным исполняемым файлом является С#.)
Если это действительно сложно, я не буду беспокоиться. Но если это будет достаточно легко, мне, возможно, придется играть с ним...
В принципе, мы написали код на С++. В Windows он компилируется в DLL, а в Linux он скомпилируется в общий объект (*.so
). Затем на стороне С# вы делаете DllImport
и записываете некоторый код управления ручной памятью, если вы пытаетесь передать что-либо нетривиальное. (Например, массивы, строки и т.д.)
Я знаю, что GHC должен поддерживать создание разделяемых библиотек на обеих платформах, но я не уверен в технических деталях. Какой синтаксис для экспорта материала, а вызывающий должен сделать что-нибудь особенное, чтобы сначала инициализировать DLL?
Конкретно: предположим, что существует функция foobar :: FilePath -> IO Int32
. Может кто-то бросить вместе небольшой рисунок эскиза:
- Какие объявления Haskell мне нужно написать, чтобы разоблачить это во внешнем мире.
- Как сообщить GHC о создании отдельного автономного файла DLL/SO.
- Все, что должен сделать вызывающий, помимо обычного процесса привязки самого
foobar
.
Я не слишком беспокоюсь о фактическом синтаксисе для С# стороны; Я думаю, что я более или менее озадачил это.
P.S. Я кратко просмотрел hs-dotnet
, но это похоже на Windows. (I.e., не будет работать с Mono, поэтому не будет работать в Linux.)