我使用Visual Studio 2010的单元测试框架遇到了一些问题。目前,QTAgent32将在测试执行完成后维护对DLL的引用。
有问题的DLL是围绕某些本机c ++代码的c ++ / cli包装器。包装器公开的对象实际上从未由托管代码分配。它唯一的参考是在处理期间进行最后检查,以确定它是否在课堂上的生命期间设置。
If(_obj != null)
{
_obj.Dispose();
_obj = null;
}
我知道这是事实,因为如果我单步执行代码并观察调试器控制台输出,我可以看到DLL的符号在点击if之前没有加载(这是有意义的)。所涉及的所有托管对象都实现了IDisposable,以确保所有本机对象都得到谨慎以避免内存泄漏。
基于这个问题:QTAgent32 Holding File Open我确保没有明确打开文件流(包括控制台),甚至没有使用任何文件,但问题仍然存在。我的想法已经不多了。
有人可以帮忙吗?
TL; DR: QTAgent32.exe保持对从未实例化的c ++ / cli包装器的开放引用。
答案 0 :(得分:11)
我在使用Fortran DLL时遇到了同样的问题。即使DLL函数完全为空,问题仍然存在。
我仍然不知道问题是什么,但一个简单的解决方法是将QTAgent32进程的杀戮指定为项目中的预构建事件。
taskkill /f /im QTAgent32.exe
exit 0
答案 1 :(得分:0)
它可能会在metadata only mode中打开DLL以搜索测试属性。这不会触发符号加载,但可以锁定文件。