首页 > 学院 > 开发设计 > 正文

经过实际验证的C#调用Haskell的方法

2019-11-17 03:26:07
字体:
来源:转载
供稿:网友
系统环境】

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,示例代码如下:

Haskell代码

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.dll  If os(windows)    CPP-Options:        -DWIN32  Extensions:           ForeignFunctionInterface           Hs-Source-Dirs:       src  Include-Dirs:         src  C-Sources:            src/pandoc.c  Install-Includes:     pandoc.h  Main-Is:              LibPandoc.hs  Ghc-Options:          -no-hs-main -optl-shared -optl-s 
复制代码

5. 在Haskell项目所在的文件夹运行命令cabal build进行编译,编译成功后会生成头文件,比如build/libpandoc.dll/libpandoc.dll-tmp/LibPandoc_stub.h

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

6. 创建用于调用Haskell的C#项目

7. 将编译出来的dll文件(比如libpandoc.dll)复制到C#项目的bin文件夹中

8. 在C#中通过DllImport引用Haskell编译出来的dll文件

class Native{    [DllImport("libpandoc", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]    public static extern IntPtr markdownToHtml(byte[] markdown);}

9. 在C#中调用Haskell通过foreign export ccall暴露出来的函数,示例代码如下:

复制代码
public class Processor {     public string Process(string text)    {        var intPtr = Native.markdownToHtml(Encoding.UTF8.GetBytes(text));        var html = Marshal.PtrToStringAnsi(intPtr);        return html;    } }
复制代码

 【参考资料】

Calling Haskell from C#

Call a Haskell function in .NET

libpandoc源代码

libpandoc-dotnet源代码


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表