Welcome

首页 / 软件开发 / C# / C#调用Haskell的方法

C#调用Haskell的方法2014-10-01 dudu 【系统环境】

Windows Server 2008 R2,Haskell Platform 2013.2.0.0,ghc 7.6.3,cabal 1.16.0

【操作步骤】

1. 安装Windows版Haskell Platform(不支持Windows Server 2012),Haskell Platform集成了cabal(相当于.NET中的msbuild+nuget), ghc(Glasgow Haskell Compiler,Haskell编译器)

2. 编写Haskell代码保存于.hs文件中,代码中加上foreign export ccall,示例代码如下:

3. 编写C代码保存于.c文件中,代码如下:

#include <windows.h>#include <Rts.h>extern void __stginit_LibPandoc(void);BOOL STDCALL DllMain(HANDLE hModule, DWORD reason, void* reserved){static char* args[] = {"libpandoc", NULL};if (reason == DLL_PROCESS_ATTACH) {startupHaskell(1, args, __stginit_LibPandoc);}return TRUE;}
4. 编写cabal配置文件保存于.cabal文件中,比如:

Name: libpandocVersion:0.5Cabal-Version:>= 1.2Build-Type: SimpleExecutable libpandoc.dllIf os(windows)CPP-Options:-DWIN32Extensions: ForeignFunctionInterface Hs-Source-Dirs: srcInclude-Dirs: srcC-Sources:src/pandoc.cInstall-Includes: pandoc.hMain-Is:LibPandoc.hsGhc-Options:-no-hs-main -optl-shared -optl-s
5. 在Haskell项目所在的文件夹运行命令cabal build进行编译,编译成功后会生成头文件,比如buildlibpandoc.dlllibpandoc.dll-tmpLibPandoc_stub.h

#include "HsFFI.h"#ifdef __cplusplusextern "C" {#endifextern HsPtr markdownToHtml(HsPtr a1);#ifdef __cplusplus}#endif