У меня есть приложение С#, которое использует неуправляемую DLL на С++. Я обнаружил сбой, который происходит только в WinXP (не Win7), когда память, которую я передаю из библиотеки С++, слишком велик.
Основной поток - это то, что С# запускает операцию в С++ DLL, вызывая функцию запуска, в которой он обеспечивает обратный вызов. Затем DLL С++ выполняет операцию и записывает информацию о регистрации в текстовый буфер. Когда операция завершена, С++ DLL вызывает обратный вызов и передает текстовый буфер в качестве параметра:
С++:
typedef void (CALLBACK *onfilecallbackfunc_t)(LPCWSTR);
DLL_API void NWAperture_SetOnFileCallback(onfilecallbackfunc_t p_pCallback);
l_pFileCallback(_wstringCapture.c_str());
С#:
public delegate void FileCallback([MarshalAs(UnmanagedType.LPWStr)] string buffer);
public static extern void SetOnFileCallback(FileCallback fileCallback);
private void OnFile(string buffer);
Это отлично работает в Win7, но в WinXP, если буфер становится слишком большим, он сбой. Я не уверен в точных размерах, которые приводят к этому, но я наложил на него ограничение в 8 МБ, и авария исчезла.
Кто-нибудь знает о пределе объема памяти, который может быть передан между С++ и С#, как это в WinXP? Или я полностью неправильно понял эту проблему и там более логичное объяснение?
Обновление: я должен был быть более конкретным - это происходит на том же ПК с двойной загрузкой WinXP и Win7, как с 32-разрядной ОС.