2011-06-02 53 views
11

我已经遇到了一些问题,使用Visual Studio 2010的单元测试框架。目前,QTAgent32将在测试执行完成后保持对DLL的引用。QTAgent32.exe保留执行后打开的DLL句柄

有问题的DLL是围绕某些本机C++代码的C++/cli包装。由包装器公开的对象实际上从未被托管代码分配。唯一的参考是在处理过程中进行最后的检查,看看它是否在班级生命期间被设置。

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

我知道这是事实,因为如果我通过代码并观察调试器控制台输出,我可以看到该DLL的符号不加载,直到击中如果(这是有道理的)。涉及的所有托管对象都实现了IDisposable,以确保所有本地对象都被注意避免内存泄漏。

基于这个问题:QTAgent32 Holding File Open我确保没有文件流被明确地打开(包括控制台),甚至没有文件被使用,但问题仍然存在。我正在想什么做什么。

任何人都可以帮忙吗?

TL; DR: QTAgent32.exe保留对从未实例化的C++/cli包装的开放引用。

回答

0

它可能会在metadata only mode中打开DLL以搜索测试属性。这不会触发符号加载,但可能会锁定文件。

11

我在使用Fortran DLL时遇到了同样的问题。即使DLL函数完全为空,问题仍然存在。

我仍然不知道问题是什么,但一个简单的解决方法是将QTAgent32进程指定为项目中的预生成事件。

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

预构建的想法其实非常好。我可能不得不从现在开始使用它。谢谢。 – JMcCarty 2012-01-13 15:05:22

+1

在下面一行中添加'exit 0'以避免qtagent32未运行时出现错误。 – Christian 2012-05-22 10:15:35

+0

@Christian没有帮助,当qtagent32没有运行时,即使使用'exit 0'也会出错。有什么帮助,而是使用这个命令:'启动taskkill/f/im QTAgent32.exe' – theV0ID 2014-01-07 16:32:32