• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

【系统环境】

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[No000070]Flash与C#通信发布时间:2022-07-10
下一篇:
C#委托及事件处理机制浅析发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap