QTAgent32.exe сохраняет дескриптор DLL после выполнения

У меня возникла проблема с использованием среды Visual Studio 2010 unit test. В настоящее время QTAgent32 будет поддерживать ссылку на DLL после завершения теста.

Рассматриваемая DLL - это оболочка С++/cli вокруг некоторого кода С++. Объект, открытый оболочкой, на самом деле никогда не назначается управляемым кодом. Единственная ссылка, которую он делает, - это окончательная проверка во время удаления, чтобы убедиться, что она была установлена ​​во время жизни класса.

If(_obj != null)
{
  _obj.Dispose();
  _obj = null;
}

Я знаю это по факту, так как, если я пройду через код и посмотрю вывод консоли отладчика, я вижу, что символы для DLL не загружаются до тех пор, пока не произойдет нажатие if (что имеет смысл). Все управляемые объекты включают в себя IDisposable, чтобы убедиться, что все собственные объекты позаботились о том, чтобы избежать утечек памяти.

Основываясь на этом вопросе: QTAgent32 Holding File Open, я убедился, что никаких открытых потоков не было открыто (включая консоль), и файлы еще не используются, но проблема остается. У меня заканчиваются идеи о том, что делать.

Может ли кто-нибудь помочь?

TL; DR: QTAgent32.exe сохраняет открытую ссылку на оболочку С++/cli, которая никогда не создается.

Ответ 1

Я столкнулся с той же проблемой при использовании библиотеки Fortran DLL. Проблема продолжалась, даже если функция DLL была полностью пустой.

Я все еще не знаю, в чем проблема, но легким обходным путем является определение убийства процесса QTAgent32 в качестве события предварительной сборки в вашем проекте.

taskkill /f /im QTAgent32.exe
exit 0

Ответ 2

Вероятно, он открывает DLL в режиме только для метаданных для поиска атрибутов теста. Это не приведет к загрузке символов, но может заблокировать файл.