【问题标题】:QTAgent32.exe keeps a handle to a DLL open after executionQTAgent32.exe 在执行后保持打开 DLL 的句柄
【发布时间】:2011-06-02 19:19:58
【问题描述】:

我在使用 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 包装器的开放引用。

【问题讨论】:

    标签: visual-studio-2010 unit-testing dll c++-cli


    【解决方案1】:

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

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

    taskkill /f /im QTAgent32.exe
    exit 0
    

    【讨论】:

    • 预构建的想法实际上非常好。从现在开始我可能不得不使用它。谢谢。
    • 在以下行中添加exit 0 以避免在 qtagent32 未运行时出错。
    • @Christian 无济于事,当 qtagent32 未运行时,即使使用 exit 0 也会出错。有什么帮助,改用这个命令:start taskkill /f /im QTAgent32.exe
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多