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

首頁 > 學院 > 開發設計 > 正文

困擾多日的C#調用Haskell問題竟然是Windows的一個坑

2019-11-17 03:26:09
字體:
來源:轉載
供稿:網友

最近一直被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調用pandoc的代碼

如果直接返回字符串,則一切正常,示例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上運行時,奇跡竟然出現了——運行正常,并且得到了正確的結果。

markdown解析成功

這時你也許又要問——不是自找麻煩嗎,為什么不一開始就用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要小心!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 太仆寺旗| 临夏市| 奉节县| 建宁县| 潞城市| 城市| 文水县| 绍兴市| 盐城市| 张家川| 库伦旗| 大冶市| 扬州市| 唐河县| 鹤岗市| 镇赉县| 通河县| 河南省| 南召县| 大余县| 启东市| 深泽县| 巩留县| 富锦市| 鞍山市| 内江市| 泽州县| 梧州市| 灵台县| 临海市| 义马市| 托克逊县| 弋阳县| 漯河市| 普定县| 九寨沟县| 远安县| 深州市| 昌宁县| 宣武区| 平原县|