C#调用Haskell的方法

【系统环境】

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索windows
, 文件
, include
, 代码
, platform
haskell
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-10-03 09:40:50

C#调用Haskell的方法的相关文章

异步调用Web服务方法

基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下的界面: 接下来就是界面上的各个"部件"去向服务器请求各种web服务,而服务器作为代理,则代为向外部web服务发出请求.(这是因为ajax调用无法跨越,所以常通过代理来请求数据) 问题场景:某个很受用户欢迎的"部件"很长时间不能执行,导致很对请求无法及时执行,引起请求失

开发自己的Web服务处理程序(以支持Ajax框架异步调用Web服务方法)

当你添加Asp.net AJAX功能到你的Web程序的时候,你需要在Web.config中做一些改变,需要你显式地移除默认的ASMX处理程序并且添加asp.net ajax框架自己的脚本处理器来作为ASMX处理程序.在上一篇异步调用Web服务方法中,我们谈论过,ajax框架的asmx(ScriptHandler)是不支持异步调用Web服务方法的,所以为了让asp.netajax支持异步Web方法调用,我们需要避开该处理器,以提供自定义的处理器来取代它. Asp.netAJAX框架的ASMX处理器

ocx-VS2010怎么使用OCX,调用里面的方法?

问题描述 VS2010怎么使用OCX,调用里面的方法? 能告诉我一下具体步骤,和调用里面的方法? 解决方案 工具栏右键,加载项,加入ocx组件,这样就和使用其他的一样了 解决方案二: 一种是增加类,导出ActiveX接口! 二是跟调用dll类似! 解决方案三: 在项目-添加引用,选择com选项卡,点浏览,找到你的ocx,确定即可. 解决方案四: import导入对应的com组件,然后就会生成包装类,你就可以调用类的方法

借助封装类实现线程调用带参方法

(一).描述      由于线程只能执行无参数方法. 有时候需要线程执行"带参数方法"      此示例演示怎样借助封装类实现"线程调用带参方法"(二).代码 本示例代码已经测试,能够正常运行! (三).示例下载  http://www.cnblogs.com/Files/ChengKing/ThreadExample.rar using System;using System.Threading; namespace 借助封装类实现_线程调用带参方法_{ clas

从Js调用一个AS方法

js 从Js调用一个AS方法: 为了从js调用as的方法,你必须确认一下四个文件都包含在你的html文档中: <script type="text/javascript" src="/path/to/Exception.js"></script>  <script type="text/javascript" src="/path/to/FlashTag.js"></script>

C#调用Haskell时的“尝试读取或写入受保护的内存”问题

最近一直被C#调用Haskell时的"尝试读取或写入受保护的内存"问题所困扰(详见C#调用haskell遭遇Attempted to read or write protected memory,C#调用haskell时的"尝试读取或写入受保护的内存"问题),而且困在其中,越陷超深,无法自拔,差点弃用C#解决我们面临的问题. 问题是这样的,只要在Haskell代码中对字符串进行操作,在C#调用时就会引发异常: An unhandled exception of ty

.net下不用AJAX实现前台JS调用后台C#方法(小技巧)

纯属小技巧,高手见笑了. 一提到如何在前台JS调用后台C#方法,AJAX成为了必然的想法. 只是实现的细节采用AJAX 1.0或者AjaxPro的区别. 其实如果不用AJAX,我们也能够很方便地利用JS调用后台方法. 步骤如下: 1 前台放一个按钮.设置为隐藏.注意:不能直接设置Visible=false的方式,这样的话在ASP.Net 2.0编译后的代码里是找不到这个按钮的.需要设置风格:style="display:none;" 2 双击按钮,写入C#方法,或者写一个调用后台其他方

JNI调用C/C++方法从控制台输入密码

最近看到一个问题,如何用Java实现从控制台输入密码?本来以为是很简单的问题,查了一下发现Java居然没提供这样一个方法.目前实现的方式有2个,一个是利用JNI来调用C/C++方法,另一个是使用多线程.下面是使用JNI的方法:首先,写出我们的Java类: public class JNIPasswordReader { private native String readPassword();static {System.loadLibrary( " PasswordDLL " );}

如何远程调用Access数据库方法详解

  如何远程调用Access数据库方法详解: 使用了TCP/IP,ADO及XML(需要安装Microsoft XML 4.0.).分服务器和客户端两部分,服务器可以多用户同时连接.远程连接Access数据库有很多方法,我以前已经比较详细的回答过(见下面所列的5种方法),我现在这个例子属于其中的第3种方法(不需要使用RDS或Web服务器). 远程连接access数据库的几个方法: 1.建立VPN(Virtual Private Network),这样你的电脑和主机的连接就与局域网无异,然后把服务器