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

王朝学院·作者佚名  2016-05-06  
宽屏版  字体: 小 | 中 | 大 | 超大  

系统环境】

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: libpandoc

Version: 0.5

Cabal-Version: >= 1.2

Build-Type: Simple

Executable 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 __cplusplus

extern "C" {

#endif

extern 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源代码

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有