我有一个使用非托管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位操作系统.