首页 新闻 会员 周边 捐助

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

0
悬赏园豆:50 [待解决问题]

在C#中调用pandoc的函数(haskell)时,总是出现错误:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

对应的英文错误信息如下:

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.

详情见博文:C#调用haskell遭遇Attempted to read or write protected memory

如何解决这个问题呢?

dudu的主页 dudu | 高人七级 | 园豆:30939
提问于:2014-05-05 12:26
< >
分享
所有回答(4)
0
喵喵喵猫 | 园豆:1742 (小虾三级) | 2014-05-05 12:34
0

public static extern IntPtr markdownToHtml(byte[] markdown);

改为:

public static extern IntPtr markdownToHtml(IntPtr markdown,int size);

 

或者

 

public static extern IntPtr markdownToHtml( [MarshalAs(UnmanagedType.LPArray,ArraySubType=UnmanagedType.U1)]byte[] markdown);

Launcher | 园豆:45050 (高人七级) | 2014-05-05 13:10

传入参数markdown的值在Haskell中是能正常拿到的

支持(0) 反对(0) dudu | 园豆:30939 (高人七级) | 2014-05-05 13:44

@dudu: 你的错误是出现在 var html =  Marshal.PtrToStringAnsi(intPtr) 这条语句吗?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-05-05 13:51

@Launcher: 错误出在Haskell代码中取writeHtmlString的结果时,如果Haskell代码中直接返回字符串,就不会出问题

支持(0) 反对(0) dudu | 园豆:30939 (高人七级) | 2014-05-05 14:04

@dudu: 错误是出现在 Native.markdownToHtml(System.Text.Encoding.UTF8.GetBytes(text)) 这句对吧!

也就是 markdown 传进去了,你的 haskell 能拿到,但是无法访问markdown 中的内容,对吗?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-05-05 14:08

@dudu: 仔细看了你的代码,应该是返回的缓冲区被回收了,所以导致内存访问错误。直接返回字符串的话,因为是常量,只要 DLL 不卸载,就会一直有效。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-05-05 14:23

@Launcher: 修改成这样:

public static extern IntPtr markdownToHtml(byte[] markdown,IntPtr buff,int size);

haskell 将内容写进你预先分配好的 buff 中去。

或者在 haskell 中这样(不会 haskell,我用c): void * p = malloc(1024);return p; 当然,这会造成内存泄露,所以应该在 haskell 中多准备两个方法:

haskell_alloc(xxxxxxxxxx);

haskell_free(p);

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-05-05 14:27

@Launcher: 很可能是这个原因

支持(0) 反对(0) dudu | 园豆:30939 (高人七级) | 2014-05-05 17:09

@dudu: 你的第二个链接不错,原来 libpandoc 有这样的 API,不仅要求提供输入输出缓冲区,连读、写回调都有。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-05-05 17:25

@Launcher: libpandoc是2010年的开源项目,现在无法编译通过,而且弄得有些复杂

支持(0) 反对(0) dudu | 园豆:30939 (高人七级) | 2014-05-05 17:40

@dudu: 这个库是干啥的?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-05-05 17:51

@Launcher: 最强大的makdown引擎非pandoc莫属,libpandoc可以编译成dll供外部调用

支持(0) 反对(0) dudu | 园豆:30939 (高人七级) | 2014-05-05 21:31
支持(0) 反对(0) dudu | 园豆:30939 (高人七级) | 2014-05-07 14:29

@dudu: 不明白!是说你编译成的非托管的 DLL,在 Windows 2008 上无法运行,但是在 Windows 2012 上能运行,是这样吗?如果是的话,问题可能出在你的编译选项上,或者程序中的一个隐含的 BUG 所致(比如缓冲区溢出)。

那么在 Windows 8 、Windows 7 和 Windows XP 上能运行吗?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-05-07 15:30

@Launcher: 没有这样的环境,在Windows 8、Windows 7、Windows XP上运行也没有实际意义

支持(0) 反对(0) dudu | 园豆:30939 (高人七级) | 2014-05-07 16:04
0

@dudu,你给1w分不足为怪啊。你怎么好意思给50分

[秦时明月] | 园豆:738 (小虾三级) | 2014-05-05 14:23
0

将程序从Windwos Server 2008移至Windows Server 2012后,问题就消失了,详见 

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

dudu | 园豆:30939 (高人七级) | 2014-05-07 14:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册