我有一个使用非托管C DLL的C#应用程序.我发现一个崩溃只发生在WinXP(而不是Win7)当我从C DLL传回的内存太大了.
基本流程是C#通过调用一个启动函数来启动C DLL中的一个操作,它在其中提供一个回调函数. C DLL然后执行操作并将日志信息转储到文本缓冲区中.当操作完成时,C DLL调用回调函数并将文本缓冲区作为参数传递:
C :
typedef void (CALLBACK *onfilecallbackfunc_t)(LPCWSTR); DLL_API void NWAperture_SetOnFileCallback(onfilecallbackfunc_t p_pCallback); l_pFileCallback(_wstringCapture.c_str());
C#:
public delegate void FileCallback([MarshalAs(UnmanagedType.LPWStr)] string buffer); public static extern void SetOnFileCallback(FileCallback fileCallback); private void OnFile(string buffer);
这在Win7中工作正常,但是在WinXP中,如果缓冲区太大,它会崩溃.我不知道确切的大小导致这个,但我已经放了一个8MB的限制,崩溃消失了.
有没有人知道在WinXP中这样可以在C和C#之间传输的内存量的限制?或者我完全误解了这个问题,还有一个更合理的解释?
更新:我应该更具体 – 这发生在同一台PC上,WinXP和Win7双启动,都是32位操作系统.
解决方法
所以最终原来我是一个白痴.为了使日志变大而加快测试速度,我点击取消按钮,该按钮在C DLL中调用一个停止执行的函数,并调用回调函数,出现“中止”错误,并记录了任何日志.但是当我这样做时,执行没有立即停止,所以当日志的回调正在进行时,C代码可能会尝试添加到日志中.这导致我看到的不稳定.
我通过使用日志周围的关键部分来修复它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。