Я реорганизую устаревшее смешанное (управляемое и неуправляемое DLL-приложение) приложение так, чтобы основной сегмент приложения был неуправляемым MFC, и это вызовет C ++ DLL, скомпилированную с флагом / clr, которая соединит управляемое (C # DLL) соединение. и неуправляемый код. К сожалению, мои изменения привели к нарушению прав доступа, которое происходит до вызова приложения InitInstance (). Это очень затрудняет отладку. Единственная информация, которую я получаю, - это следующая трассировка стека.
> 64006108()
ntdll.dll!_ZwCreateMutant@16() + 0xc bytes
kernel32.dll!_CreateMutexW@12() + 0x7a bytes
Итак, вот некоторые sceanrios, которые я пробовал.
- Включено исключение-> Исключения Win32-> c0000005 Нарушение доступа, чтобы прервать работу при выбросе. Тем не менее, самая подробная информация, которую я получаю, из приведенной выше трассировки стека. Я пробовал приложение с помощью F10, но оно не работает до того, как будут достигнуты какие-либо точки останова, и завершается с помощью описанной выше трассировки стека.
- Я отключил библиотеку DLL моста, чтобы в ней был только один метод, который возвращает bool, и этот метод закодирован так, чтобы просто возвращать false (код C # не вызывается).
bool DllPassthrough::IsFailed() { return false; }
Если заглушка DLL скомпилирована с флагом / clr, приложение завершится ошибкой. Если он скомпилирован без флага / clr, приложение запускается.
- Я создал заглушку MFC-приложения с помощью мастера Visual Studio для приложений с несколькими документами и вызвал DllPassthrough :: IsFailed (). Это удается даже с флагом / clr, используемым для компиляции DLL.
- Я попытался сделать ручную LoadLibrary на winmm.lib, как указано в следующем примечании Нарушение прав доступа при использовании c ++ / cli . Приложение по-прежнему не работает.
Итак, мои вопросы, как решить проблему? Любые подсказки, стратегии или предыдущие инциденты. И, в противном случае, как я могу получить больше информации о том, какой сегмент кода или библиотека вызывает исключение доступа? Если я попытаюсь использовать более сложные обходные пути, такие как вызовы LoadLibrary, я бы хотел сузить его до неисправных библиотек.
Благодарю. Кстати, мы используем Visual Studio 2008, и проект строится на основе платформы .NET 2.0 для управляемых разделов.