2011-06-02 7 views
11

Me he encontrado con un problema al usar el marco de prueba de la unidad de Visual Studio 2010. Actualmente, QTAgent32 mantendrá una referencia a una DLL una vez que la ejecución de una prueba haya finalizado.QTAgent32.exe mantiene el control de una DLL abierta después de la ejecución

La DLL en cuestión es una envoltura de C++/cli alrededor de algún código C++ nativo. El objeto expuesto por el contenedor nunca es asignado por el código administrado. La única referencia que hace es una comprobación final durante la eliminación para ver si se ha establecido durante la vida útil de la clase.

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

Sé que esto es un hecho ya que si me paso a través del código y ver la salida de la consola depurador puedo ver los símbolos para el DLL no se cargan hasta golpear el caso (que tiene sentido). Todos los objetos administrados involucrados implementan IDisposable para asegurarse de que todos los objetos nativos se cuiden para evitar fugas de memoria.

Basado en esta pregunta: QTAgent32 Holding File Open Me aseguré de que no se abrieran explícitamente archivos (incluida la consola) y aún no se utilizan archivos, pero el problema persiste. Me estoy quedando sin ideas sobre qué hacer.

¿Alguien puede ayudar?

TL; DR: QTAgent32.exe mantiene una referencia abierta a un contenedor C++/cli que nunca se crea una instancia.

Respuesta

0

Probablemente se abre el archivo DLL en metadata only mode con el fin de buscar atributos de prueba. Esto no activaría la carga de símbolos, pero podría bloquear el archivo.

11

Me encontré con el mismo problema al usar una DLL Fortran. El problema persistió incluso si la función DLL estaba completamente vacía.

Todavía no sé cuál es el problema, sino una solución fácil es especificar el asesinato del proceso QTAgent32 como un evento de pre-construcción en su proyecto.

taskkill /f /im QTAgent32.exe 
exit 0 
+1

La idea de preconstrucción es realmente muy agradable. Debo tener que usar eso a partir de ahora. Gracias. – JMcCarty

+1

Agregue en la siguiente línea una 'exit 0' para evitar un error cuando qtagent32 no se está ejecutando. – Christian

+0

@Christian No ayuda, obtengo un error incluso con 'exit 0' cuando qtagent32 no se está ejecutando. Lo que sí ayuda, es usar este comando en su lugar: 'start taskkill/f/im QTAgent32.exe' – theV0ID

Cuestiones relacionadas