国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

經(jīng)過實際驗證的C#調(diào)用Haskell的方法

2019-11-17 03:26:07
字體:
供稿:網(wǎng)友
系統(tǒng)環(huán)境】

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文件中,代碼如下:

復(fù)制代碼
#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;}
復(fù)制代碼

4. 編寫cabal配置文件保存于.cabal文件中,比如:

復(fù)制代碼
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 
復(fù)制代碼

5. 在Haskell項目所在的文件夾運行命令cabal build進行編譯,編譯成功后會生成頭文件,比如build/libpandoc.dll/libpandoc.dll-tmp/LibPandoc_stub.h

復(fù)制代碼
#include "HsFFI.h"#ifdef __cplusplusextern "C" {#endifextern HsPtr markdownToHtml(HsPtr a1);#ifdef __cplusplus}#endif
復(fù)制代碼

6. 創(chuàng)建用于調(diào)用Haskell的C#項目

7. 將編譯出來的dll文件(比如libpandoc.dll)復(fù)制到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#中調(diào)用Haskell通過foreign export ccall暴露出來的函數(shù),示例代碼如下:

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

 【參考資料】

Calling Haskell from C#

Call a Haskell function in .NET

libpandoc源代碼

libpandoc-dotnet源代碼


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 岢岚县| 宁陕县| 双城市| 威宁| 舞钢市| 大城县| 穆棱市| 鄢陵县| 云浮市| 哈巴河县| 余庆县| 石家庄市| 淮南市| 仪征市| 衢州市| 阿拉善右旗| 西林县| 固始县| 镇平县| 蓝山县| 和龙市| 五大连池市| 天水市| 郁南县| 兴安盟| 玉溪市| 张掖市| 龙山县| 宣汉县| 陇西县| 元氏县| 托克托县| 宁化县| 德安县| 临清市| 晋城| 会昌县| 安乡县| 平塘县| 青冈县| 马山县|