|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
中间码是基于一个虚拟机器。源代码是最高层的,理论上从源代码开始直接编译成本地码能提供最大优化的。而中间码只能是转译成本地码,效率上难免受到损耗。根据虚拟机器所设定的体系结构的特点,和本地机器的差异的多少。【体系情况】
WindowsServer2008R2,HaskellPlatform2013.2.0.0,ghc7.6.3,cabal1.16.0
【操纵步骤】
1.安装Windows版HaskellPlatform(不撑持WindowsServer2012),HaskellPlatform集成了cabal(相称于.NET中的msbuild+nuget),ghc(GlasgowHaskellCompiler,Haskell编译器)
2.编写Haskell代码保留于.hs文件中,代码中加上foreignexportccall,示例代码以下:
3.编写C代码保留于.c文件中,代码以下:
- #include<windows.h>#include<Rts.h>externvoid__stginit_LibPandoc(void);BOOLSTDCALLDllMain(HANDLEhModule,DWORDreason,void*reserved){staticchar*args[]={"libpandoc",NULL};if(reason==DLL_PROCESS_ATTACH){startupHaskell(1,args,__stginit_LibPandoc);}returnTRUE;}
复制代码
4.编写cabal设置文件保留于.cabal文件中,好比:
- Name:libpandocVersion:0.5Cabal-Version:>=1.2Build-Type:SimpleExecutablelibpandoc.dllIfos(windows)CPP-Options:-DWIN32Extensions:ForeignFunctionInterfaceHs-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项目地点的文件夹运转命令cabalbuild举行编译,编译乐成后会天生头文件,好比buildlibpandoc.dlllibpandoc.dll-tmpLibPandoc_stub.h
- #include"HsFFI.h"#ifdef__cplusplusextern"C"{#endifexternHsPtrmarkdownToHtml(HsPtra1);#ifdef__cplusplus}#endif
复制代码
6.创立用于挪用Haskell的C#项目
7.将编译出来的dll文件(好比libpandoc.dll)复制到C#项目标bin文件夹中
8.在C#中经由过程DllImport援用Haskell编译出来的dll文件- classNative{[DllImport("libpandoc",CallingConvention=CallingConvention.Cdecl,CharSet=CharSet.Unicode)]publicstaticexternIntPtrmarkdownToHtml(byte[]markdown);}
复制代码 9.在C#中挪用Haskell经由过程foreignexportccall表露出来的函数,示例代码以下:
- publicclassProcessor{publicstringProcess(stringtext){varintPtr=Native.markdownToHtml(Encoding.UTF8.GetBytes(text));varhtml=Marshal.PtrToStringAnsi(intPtr);returnhtml;}}
复制代码
可怜的程序员,还是逃不出移植的命运! |
|