我有一个使用非托管 C++ DLL 的 C# 应用程序。当我从 C++ DLL 传回的内存太大时,我发现只有在 WinXP(不是 Win7)中才会发生崩溃。
基本流程是 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++ 代码可以尝试添加到日志中。这导致了我所看到的不稳定。
我通过在日志周围使用关键部分来修复它。
关于c# - 从 C# 中的 C++ DLL 获取回调时,WinXP 中的内存限制是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7667191/