困扰多日的C#调用Haskell问题竟然是Windows的一个坑
最近一直被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的一个坑相关推荐
- Java黑皮书课后题第7章:7.15(消除重复)使用下面的方法头编写方法,消除数组中重复出现的值。编写一个测试程序,读取10个数,调用该方法,并显示以一个空格分隔的不同数字
7.15(消除重复)使用下面的方法头编写方法,消除数组中重复出现的值.编写一个测试程序,读取10个数,调用该方法,并显示以一个空格分隔的不同数字 题目 题目描述与运行示例 破题 代码 21.11.11 ...
- 关于php调用.net的web service 踩过的坑
从前一阵开始,公司要和对方做web service对接.由于对方使用.net语言,而我方使用php.本来经理是要求我们也用.net写web service的服务端.而我上学时学的.net全忘了... ...
- 记录一次C语言调用go生成的动态库的踩坑过程
记录一次C语言调用go生成的动态库的踩坑过程 问题现象 由于某些特殊原因,需要在C语言中调用go语言生成的so,本来挺顺利,一切都运行的很好.突然某一天,不知道怎么回事,再一个新程序中无法正常运行了, ...
- python实现动态壁纸_流弊了!竟然用Python做一个炫酷的小姐姐动态壁纸
原标题:流弊了!竟然用Python做一个炫酷的小姐姐动态壁纸 公众号关注 " 菜鸟学Python" 设为 "星标",每天带你玩转Python! (女神IU,图片 ...
- vb用txt打开html文件,VB打开记事本程序源码,即用VB调用记事本,或用记事本打开一个txt文本文件。...
VB打开记事本程序源码,即用VB调用记事本,或用记事本打开一个txt文本文件. 用VB调用记事本程序比较简单,可以API函数ShellExecute来实现,很简单,只要一行代码. 先在窗体模块声明AP ...
- golang直接调用ffmpeg预编译类库(windows)已更新
MinGW介绍 MINGW(Minimalist GNU on Windows)是一个可以在windows下编译Linux程序的仿真linux编译环境,他提供了linux下的C.C++头文件.系统库和 ...
- 这么多年代码发展, 竟然发现读到一个文件位置竟不容易
有一个 1G 大的 文本 行文件, 首先我要计出特定行在文件中位置,保存到一个偏移量表文件, 便于后面任意时候打开时可定位取文件块: 以为是一个发展了 30多年的代码早就解决的基本问题(当年在文件流上 ...
- 调用百度地图地址下拉搜索栏爬坑
调用百度地图地址下拉搜索栏爬坑 问题描述 在项目编写的过程中,我将调用百度API的部分封装成了一个组件,以便后续的调用.在组件的各项显示中,都能顺利显示,并且调用.但,我将组件调用后,发现,搜索提示栏 ...
- 服务器蓝屏显示7f,困扰多日的7F蓝屏
win7旗舰版,avast和look n stop杀软和防火墙,只要是迅雷或者酷播累得进行BT类的P2P下载一阵之后就出现7F蓝屏,看DMP文件说是显卡驱动的一个文件问题,网卡显卡驱动都更新过很多次还 ...
最新文章
- mysql 先排序再去重_有人说先学会三轴,再去搞四轴、五轴加工中心,这几种有何区别?...
- c#调用c++的dll接口
- 【JEECG Docker安装】CentOS6下docker的安装和使用
- ELSE 技术周刊(2017.12.11期)
- PHP Redis List [列表] 的使用
- STM32:位带操作分析
- win10快捷键启动屏幕保护程序
- 串口通信工具android,串口调试工具手机版
- 蛋白质降解技术中常用的蛋白酶(一)
- iOS开发技巧--xcode中的group与folder
- 计算机绘图作业西南交大,西南交大计算机绘图A 离线作业.doc
- imagemagick 图片合并
- ip网络广播系统服务器,IP网络广播系统控制软件
- 不止ChatGPT,谷歌云 AI 方案早已厉兵秣马!
- ubuntu使用python读串口_21.python通过pyserial读写串口--2013-06-02
- JDK 11 API中文帮助文档.CHM文档无法打开问题
- JS中关于正则表达式的一些个人理解
- 利用MATLAB进行系统时域分析,matlab控制系统时域分析教程
- rufus-scheduler 定时任务示例
- POSIX多线程程序设计_流水线工作例程
热门文章
- Xdebug的安装-(无错可执行版)
- lighttpd 负载均衡-反向代理+cache浅谈
- C#精髓【月儿原创】第一讲 使用垃圾回收器
- 从零开始学ASP.NET(基础篇)
- 【EMC】EMC屏蔽设计
- 【Qt】QtCreator中的单例编程(以ActionManager为例)
- Java项目:企业员工绩效工资管理系统(java+SpringBoot+FreeMarker+Mysql)
- 加密解密php,PHP实现的加密解密处理类
- 【java】浅谈注释
- Jquery各版本下载,附Jquery官网下载方法