Возможно ли выполнить отладку в режиме DLL с выпуском в режиме EXE?
Я пытаюсь этот сценарий, но EXE не загружает отладочную DLL и выдает ошибку «Это приложение не удалось запустить …».
Я знаю, что это плохой сценарий, но из-за определенных требований я должен выполнить эту работу.
Да, это может работать.
Ваша проблема с «приложением не удалось запустить», скорее всего, вы скопировали отладочную версию библиотеки DLL (созданной на вашем компьютере с помощью Visual Studio) на компьютер, на котором не был установлен DEBUG CRT. Обычно копирование через MSVCRTD (версия) .dll в тот же каталог, где находятся ваши программные файлы, решает эту проблему. У меня есть предыдущий ответ, который охватывает некоторые из этого Вот.
Лучше всего, чтобы все ваши двоичные файлы всегда были связаны с одной и той же динамической библиотекой MSVCRT, чтобы они все имели одинаковое время выполнения.
Другой простой способ — скомпилировать вашу DLL-библиотеку DEBUG, чтобы использовать тот же вариант DLL-библиотеки MSVCRT (или статически связываться с CRT). Где-то на страницах свойств проекта VS (генерация кода, я думаю) есть выпадающий список для выбора CRT. Нет ничего плохого в том, чтобы связать розничный MSVCRT с отладочной DLL или статически связывать.
Вещи, на которые стоит обратить внимание, — это когда у вас есть другой вид среды выполнения отладки C, связанный с различными двоичными файлами. Если у вас есть DLL-версия MSVCRT, связанная с EXE, но отладочная MSCVRTD DLL для DLL, это может вызвать проблемы в некоторых случаях. Это связано с тем, что дескрипторы и блоки памяти отслеживаются двумя разными экземплярами CRT.
Примеры:
Если вы выделяете память в EXE, но свободны в DLL. И наоборот.
Файловые дескрипторы открываются с помощью fopen () в EXE, но используются или закрываются в EXE (и наоборот).
Для любого из заголовочных файлов для интерфейса DLL наличие любых встроенных функций или методов, реализованных в заголовочном файле, является простым способом вызвать # 1 или # 2.
Совместное использование объектов STL (std :: string, std :: list, std :: vector) является определенным нет-нет для смешанного использования CRT.
Это может работать, если ваш dll-интерфейс не имеет зависимостей от классов, которые могут отличаться при отладке и выпуске.
например std :: string и std :: vector в MSVC не совместимы при отладке и выпуске. (Заборы …)
Так например
std::string GetName();
не будет работать.
В дополнительные new и delete не следует сдвигать, потому что для отладки / выпуска используются разные среды выполнения. Но в любом случае вы должны всегда delete
в том же контексте (dll / exe), что и new
,