zoukankan      html  css  js  c++  java
  • C#调用haskell遭遇Attempted to read or write protected memory

    1. Haskell的代码如下:

    haskell调用pandoc的代码

    上面的代码中readMarkdown与writeHtmlString是pandoc中的函数,newString的作用是将String转换为IO CString。

    2. C语言的代码如下:

    调用pandoc的C语言代码

    上面的代码是dll的调用入口。

    3. ghc编译出来的头文件如下:

    haskell ghc编译出来的头文件

    4. 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;
        } 
    }

    5. 运行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.

      对应的中文错误信息:

    尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

    6. 而在ghci中执行直接执行haskell代码能得到正确的结果:

    被这个“Attempted to read or write protected memory. ”问题困扰了很长时间,一直未找到解决方法。

    【更新】

    后来找到了解决方法,详见:困扰多日的C#调用Haskell问题竟然是Windows的一个坑

  • 相关阅读:
    Ubuntu虚拟机磁盘空间不足的解决
    eclipse启动报错 JVM terminated. Exit code=1
    Ubuntu16.04 安装eclipse
    HDU 1710 Binary Tree Traversals(二叉树)
    Ubuntu16.04 搭建伪分布式Hadoop环境
    HDU 1560 DNA sequence(IDA*)
    Go的函数
    Go的包
    Go语言开发环境搭建
    go的循环
  • 原文地址:https://www.cnblogs.com/dudu/p/hakell-attempted-to-read-or-write-protected-memory.html
Copyright © 2011-2022 走看看