僅供參考,我能得到下面的步驟在Windows下工作...
{-# LANGUAGE ForeignFunctionInterface #-}
module Fibonacci() where
import Data.Word
import Foreign.C.Types
fibs :: [Word32]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
fibonacci :: Word8 -> Word32
fibonacci n =
if n > 47
then 0
else fibs !! (fromIntegral n)
c_fibonacci :: CUChar -> CUInt
c_fibonacci (CUChar n) = CUInt (fibonacci n)
foreign export ccall c_fibonacci :: CUChar -> CUInt
與
ghc --make -shared Fibonacci.hs
這將產生半打的文件,其中一個是HSdll.dll
編譯此。然後我複製到這一個Visual Studio C#項目,並做了以下內容:
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
public sealed class Fibonacci : IDisposable
{
#region DLL imports
[DllImport("HSdll.dll", CallingConvention=CallingConvention.Cdecl)]
private static extern unsafe void hs_init(IntPtr argc, IntPtr argv);
[DllImport("HSdll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern unsafe void hs_exit();
[DllImport("HSdll.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern UInt32 c_fibonacci(byte i);
#endregion
#region Public interface
public Fibonacci()
{
Console.WriteLine("Initialising DLL...");
unsafe { hs_init(IntPtr.Zero, IntPtr.Zero); }
}
public void Dispose()
{
Console.WriteLine("Shutting down DLL...");
unsafe { hs_exit(); }
}
public UInt32 fibonacci(byte i)
{
Console.WriteLine(string.Format("Calling c_fibonacci({0})...", i));
var result = c_fibonacci(i);
Console.WriteLine(string.Format("Result = {0}", result));
return result;
}
#endregion
}
}
的Console.WriteLine()
電話是明顯可選。
我還沒有嘗試過在Mono/Linux下運行它,但它大概是類似的。
總之,獲得C++ DLL的難度大致相同。 (即獲得類型簽名匹配並使編組正確工作是困難的)
我還必須編輯項目設置並選擇「允許不安全的代碼」。
對於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