Следует помнить, что каждая копия библиотеки времени выполнения C имеет свои собственные состояния. Если SomeSpecificModule.dll статически связан с библиотекой времени выполнения C, может возникнуть такая проблема. Если это так, попробуйте установить связь с DLL-версией библиотеки времени выполнения C. Вы также должны убедиться, что SomeSpecificModule.dll скомпилирован и связан точно так же, как ваш основной модуль.
Вы упомянули, что DLL выгружена, и были вызваны правильные деструкторы, похоже, ваша настоящая программа работает намного больше, чем пример, который вы опубликовали. Если вы выгрузили SomeSpecificModule.dll в своем блоке try, вы выгрузили запись об исключении для SomeSpecificModule :: Foo (), и я полагаю, что именно так вы получили сбой при m svcr90d.dll!__DestructExceptionObject(EHExceptionRecord * ...
Тем не менее, в общем случае исключение через границы DLL вызывает проблемы. Если вы выбрасываете объект не POD, у вас могут возникнуть проблемы с памятью, выделенной другой библиотекой времени выполнения C в другой куче, с другой настройкой компилятора, версией STL ... вы понимаете.
Измените свой код, чтобы вы не пересекали границы DLL. Однажды кто-то из вашей команды поменяет настройку компилятора или сторонний заголовок #define, и ваша программа начнет аварийно завершать работу, и вам будет очень трудно найти причину.
В любом случае, не видя реального кода, я просто пытаюсь угадать, что может пойти не так. Надеюсь, это поможет.