最近一直被C#调用Haskell时的“尝试读取或写入受保护的内存”问题所困扰(详见C#调用haskell遭遇Attempted to read or write protected memory,C#调用haskell时的“尝试读取或写入受保护的内存”问题),而且困在其中,越陷超深,无法自拔,差点弃用C#解决我们面临的问题。

问题是这样的,只要在Haskell代码中对字符串进行操作,在C#调用时就会引发异常:

An unhandled exception of type 'System.AccessViolationException' occurred in Unknown Module.

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

示例Haskell代码如下:

如果直接返回字符串,则一切正常,示例Haskell代码如下:

C#调用示例代码:

class Native
{[DllImport("libpandoc", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]public static extern IntPtr markdownToHtml(byte[] markdown);
}public class Processor
{public string Process(string text){var intPtr = Native.markdownToHtml(System.Text.Encoding.UTF8.GetBytes(text));var html =  Marshal.PtrToStringAnsi(intPtr);return html;}
}

你也许会问——吃饱撑着了,为什么要用C#调用Haskell?

没撑着!因为史上最强大的Markdown引擎pandoc就是用Haskell开发的,不是C#,不是Java,不是PHP,不是Python,也不是C/C++,更不是Objective-C。真正要比的不是语言,而且是用语言开发出来的东西。

你也许要问——很多人看不起的微软家的C#能调用高上大的Haskell?

当然能!而且经过了实际验证,详见经过实际验证的C#调用Haskell的方法。虽然是通过FFI(ForeignFunctionInterface),借助C编译成非托管的dll,但不管怎么样,C#做到了。

但当我们用C#调用Haskell解决实际问题时,遭遇了“Attempted to read or write protected memory. ”问题,反复折腾找不到解决之道,处于绝望中,以为“C#可以调用Hakell"是一个“骗局”。

。。。

今天上午,当我们把编译好的程序从Windows Server 2008 R2复制到Windows Server 2012上运行时,奇迹竟然出现了——运行正常,并且得到了正确的结果。

这时你也许又要问——不是自找麻烦吗,为什么不一开始就用Windows Server 2012?

不是自找麻烦,是麻烦自己找上门的。因为编译Haskell代码需要安装Haskell Platform(集成了ghc),而Haskell Platform不能在Windows Server 2012正常安装,只能被迫在Windows Server 2008上安装(当时也被折腾了)。

万万没有想到的是,Windows Server 2008上编译出来的程序不能在Windows Server 2008上正常运行,却奇迹般地能在Windows Server 2012上能正常运行。这是不是Windows的一个坑呢?

由此想到我们在阿里云上曾经遭遇的“黑色10秒”问题,是因为Windows Server 2008在WAS(Windows Process Activation Service)中使用了spinlock,而虚拟化技术对spinlock支持不好,最终也是通过换用Windows Server 2012解决了问题。这虽然不能说是Windows Server 2008的一个坑,但说明了一点——使用Windows Server,2008要小心!

转载于:https://www.cnblogs.com/dudu/p/csharp-haskell-windows.html

困扰多日的C#调用Haskell问题竟然是Windows的一个坑相关推荐

  1. Java黑皮书课后题第7章:7.15(消除重复)使用下面的方法头编写方法,消除数组中重复出现的值。编写一个测试程序,读取10个数,调用该方法,并显示以一个空格分隔的不同数字

    7.15(消除重复)使用下面的方法头编写方法,消除数组中重复出现的值.编写一个测试程序,读取10个数,调用该方法,并显示以一个空格分隔的不同数字 题目 题目描述与运行示例 破题 代码 21.11.11 ...

  2. 关于php调用.net的web service 踩过的坑

    从前一阵开始,公司要和对方做web service对接.由于对方使用.net语言,而我方使用php.本来经理是要求我们也用.net写web service的服务端.而我上学时学的.net全忘了... ...

  3. 记录一次C语言调用go生成的动态库的踩坑过程

    记录一次C语言调用go生成的动态库的踩坑过程 问题现象 由于某些特殊原因,需要在C语言中调用go语言生成的so,本来挺顺利,一切都运行的很好.突然某一天,不知道怎么回事,再一个新程序中无法正常运行了, ...

  4. python实现动态壁纸_流弊了!竟然用Python做一个炫酷的小姐姐动态壁纸

    原标题:流弊了!竟然用Python做一个炫酷的小姐姐动态壁纸 公众号关注 " 菜鸟学Python" 设为 "星标",每天带你玩转Python! (女神IU,图片 ...

  5. vb用txt打开html文件,VB打开记事本程序源码,即用VB调用记事本,或用记事本打开一个txt文本文件。...

    VB打开记事本程序源码,即用VB调用记事本,或用记事本打开一个txt文本文件. 用VB调用记事本程序比较简单,可以API函数ShellExecute来实现,很简单,只要一行代码. 先在窗体模块声明AP ...

  6. golang直接调用ffmpeg预编译类库(windows)已更新

    MinGW介绍 MINGW(Minimalist GNU on Windows)是一个可以在windows下编译Linux程序的仿真linux编译环境,他提供了linux下的C.C++头文件.系统库和 ...

  7. 这么多年代码发展, 竟然发现读到一个文件位置竟不容易

    有一个 1G 大的 文本 行文件, 首先我要计出特定行在文件中位置,保存到一个偏移量表文件, 便于后面任意时候打开时可定位取文件块: 以为是一个发展了 30多年的代码早就解决的基本问题(当年在文件流上 ...

  8. 调用百度地图地址下拉搜索栏爬坑

    调用百度地图地址下拉搜索栏爬坑 问题描述 在项目编写的过程中,我将调用百度API的部分封装成了一个组件,以便后续的调用.在组件的各项显示中,都能顺利显示,并且调用.但,我将组件调用后,发现,搜索提示栏 ...

  9. 服务器蓝屏显示7f,困扰多日的7F蓝屏

    win7旗舰版,avast和look n stop杀软和防火墙,只要是迅雷或者酷播累得进行BT类的P2P下载一阵之后就出现7F蓝屏,看DMP文件说是显卡驱动的一个文件问题,网卡显卡驱动都更新过很多次还 ...

最新文章

  1. mysql 先排序再去重_有人说先学会三轴,再去搞四轴、五轴加工中心,这几种有何区别?...
  2. c#调用c++的dll接口
  3. 【JEECG Docker安装】CentOS6下docker的安装和使用
  4. ELSE 技术周刊(2017.12.11期)
  5. PHP Redis List [列表] 的使用
  6. STM32:位带操作分析
  7. win10快捷键启动屏幕保护程序
  8. 串口通信工具android,串口调试工具手机版
  9. 蛋白质降解技术中常用的蛋白酶(一)
  10. iOS开发技巧--xcode中的group与folder
  11. 计算机绘图作业西南交大,西南交大计算机绘图A 离线作业.doc
  12. imagemagick 图片合并
  13. ip网络广播系统服务器,IP网络广播系统控制软件
  14. 不止ChatGPT,谷歌云 AI 方案早已厉兵秣马!
  15. ubuntu使用python读串口_21.python通过pyserial读写串口--2013-06-02
  16. JDK 11 API中文帮助文档.CHM文档无法打开问题
  17. JS中关于正则表达式的一些个人理解
  18. 利用MATLAB进行系统时域分析,matlab控制系统时域分析教程
  19. rufus-scheduler 定时任务示例
  20. POSIX多线程程序设计_流水线工作例程

热门文章

  1. Xdebug的安装-(无错可执行版)
  2. lighttpd 负载均衡-反向代理+cache浅谈
  3. C#精髓【月儿原创】第一讲 使用垃圾回收器
  4. 从零开始学ASP.NET(基础篇)
  5. 【EMC】EMC屏蔽设计
  6. 【Qt】QtCreator中的单例编程(以ActionManager为例)
  7. Java项目:企业员工绩效工资管理系统(java+SpringBoot+FreeMarker+Mysql)
  8. 加密解密php,PHP实现的加密解密处理类
  9. 【java】浅谈注释
  10. Jquery各版本下载,附Jquery官网下载方法