私はちょうど先週、C#のコードを私の日の仕事の一部として実行する方法を考え出しました。私たちはそれをいつまでも理解することができましたが、最終的な解決策はかなり簡単です。C#からHaskellを呼び出す
今私は興味があります...ハスケルをC#から呼び出すのはどれくらい難しいでしょうか? (注意深く:それはHaskell から C#までですが、それ以外の方法ではありませんので、主な実行ファイルはC#です)
本当に難しい場合は、私は気にしません。しかし、合理的に簡単であれば、私はそれを持って遊びをする必要があります...
基本的に、私たちはいくつかのC + +コードを書いています。 WindowsではDLLにコンパイルされ、Linuxでは共有オブジェクトにコンパイルされます(*.so
)。その後、C#側でDllImport
を実行し、何かを渡すのが面倒であれば、手動のメモリ管理コードを書いてください。 (例:配列、文字列など)
私はGHCが両方のプラットフォームで共有ライブラリを構築することをサポートしていますが、技術的な詳細はわかりません。何かをエクスポートする構文は何ですか?また、呼び出し元はDLLを最初に初期化するために特別な処理を行う必要がありますか?
具体的には、関数foobar :: FilePath -> IO Int32
が存在するとします。誰かが小さなスケッチを一緒に投げることができます:
- これを外の世界に公開するために私が書く必要があるものは何ですか。
- GHCに、自己完結型のDLL/SOファイルを1つ作成するように指示する方法を教えてください。
- 呼び出し側が特別な処理を行う必要があるものは何でも、
foobar
自体をバインドする通常の処理を超えてください。
私はC#側の実際の構文についてあまり心配していません。私は多かれ少なかれそれを困惑させたと思う。
P.S.私は簡単にhs-dotnet
を見ましたが、これはWindows固有のようです。 (つまり、Monoでは動作しませんので、Linuxでは動作しません)
FFIバインディングのプランBは、「Cで薄いラッパーを作成する」ことができます。どんな種類のFFIでもほとんどの言語はCと相互に作用することができます。 –
ポインタ:GHCユーザーガイドの章4.13と8.2、http://www.haskell.org/haskellwiki/Calling_Haskell_from_C –
GHCにはDLL作成に関する章があります:http://www.haskell.org/ghc/docs/latest/html/users_guide/win32-dlls.html最近のバージョンのGHCではこのセクションが変更されているようです。 (!) – MathematicalOrchid