У меня есть приложение C #, которое использует неуправляемую C ++ DLL. Я обнаружил сбой, который происходит только в 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, если буфер становится слишком большим, он падает. Я не уверен в точном размере, который вызывает это, но я установил ограничение в 8 МБ, и сбой исчез.
Кто-нибудь знает об ограничении объема памяти, который может передаваться между C ++ и C #, как это в WinXP? Или я полностью неправильно понял эту проблему, и есть более логичное объяснение?
Обновление: я должен был быть более конкретным - это происходит на одном компьютере с двойной загрузкой WinXP и Win7, обе 32-разрядные ОС.