Visual studio 2010 QTAgent32.exe在执行后保持DLL的句柄打开
我在使用VisualStudio2010的单元测试框架时遇到了一些问题。当前,QTAgent32将在测试执行完成后维护对DLL的引用Visual studio 2010 QTAgent32.exe在执行后保持DLL的句柄打开,visual-studio-2010,unit-testing,dll,c++-cli,Visual Studio 2010,Unit Testing,Dll,C++ Cli,我在使用VisualStudio2010的单元测试框架时遇到了一些问题。当前,QTAgent32将在测试执行完成后维护对DLL的引用 DLL是一个围绕本地C++代码的C++/CLI包装器。包装器公开的对象实际上从未由托管代码分配。它所做的唯一参考是在处理过程中进行最终检查,以查看它是否在类的生命周期内设置 If(_obj != null) { _obj.Dispose(); _obj = null; } 我知道这是一个事实,因为如果我单步执行代码并观察调试器控制台的输出,我可以看到D
DLL是一个围绕本地C++代码的C++/CLI包装器。包装器公开的对象实际上从未由托管代码分配。它所做的唯一参考是在处理过程中进行最终检查,以查看它是否在类的生命周期内设置
If(_obj != null)
{
_obj.Dispose();
_obj = null;
}
我知道这是一个事实,因为如果我单步执行代码并观察调试器控制台的输出,我可以看到DLL的符号在点击if(这是有意义的)之前不会加载。所有涉及的托管对象都实现IDisposable,以确保所有本机对象都得到保护,以避免内存泄漏
基于这个问题:我确保没有显式打开任何文件流(包括控制台),甚至没有使用任何文件,但问题仍然存在。我已经没有办法做什么了
有人能帮忙吗
TL;DR:QTAgent32.exe保留对从未实例化的c++/cli包装的开放引用。它可能打开DLL以搜索测试属性。这不会触发符号加载,但会锁定文件。我在使用Fortran DLL时遇到了同样的问题。即使DLL函数完全为空,问题仍然存在 我仍然不知道问题是什么,但一个简单的解决方法是在项目中指定杀死QTAgent32进程作为预构建事件
taskkill /f /im QTAgent32.exe
exit 0
预构建的想法实际上非常好。从现在起,我可能不得不使用它。谢谢。在下面的行中添加一个退出0,以避免qtagent32未运行时出错。@Christian没有帮助,即使qtagent32未运行时退出0,我也会出错。有帮助的是改用这个命令:
start taskkill/f/im QTAgent32.exe