停止时Visual Studio项目仍然“卡住”

时间:2010-05-04 15:53:17

标签: visual-studio com interop debugging hp-quality-center

目前正在为HP质量中心开发连接器DLL。我正在使用他们的(插入exlative)COM API连接到服务器。 Interup包装器由VStudio自动创建。

我的解决方案有两个项目:DLL和测试器应用程序 - 本质上是一个带有调用DLL中函数的按钮的表单。一切都很好 - 我可以创建缺陷,更新它们并删除它们。当我关闭主窗体时,应用程序会很好地停止。

但是当我调用一个返回所有可用项目列表的函数(填充组合框)时,如果我关闭主窗体,VStudio仍会显示解决方案正在运行,我必须停止它。

我已经设法在我的代码中查明了一个函数,当我调用时,解决方案仍然是“挂起”,如果我不这样做,它会很好地关闭。它是对TDC对象get_VisibleProjects中的属性的调用,它返回List(不是.Net的一个,而是COM库中的一个类型) - 我只是迭代它并返回一个正确的列表(我后来用来填充组合框):

    public List<string> GetAvailableProjects()
    {
        List<string> projects = new List<string>();
        foreach (string project in this.tdc.get_VisibleProjects(qcDomain))
        {
            projects.Add(project);
        }
        return projects;
    }

我的假设是某些东西会被保留在内存中。如果我在VStudio之外运行EXE它会关闭 - 但是谁知道内存中会留下什么?

我的问题是 - 如何摆脱任何调用此属性返回的内容? GC不应该处理这个吗?我需要深入研究指针吗?

我尝试过的事情:

  1. 将列表放入变量并在函数末尾将其设置为null
  2. 向类添加析构函数并使tdc对象
  3. 为空
  4. 逐步完成测试仪功能应用程序,表单关闭,Main功能结束 - 它关闭,但VStudio仍显示我正在运行。
  5. 感谢您的协助!

4 个答案:

答案 0 :(得分:0)

完成后,您是否尝试使用System.Runtime.InteropServices.Marshal.ReleaseComObject手动释放List对象?

答案 1 :(得分:0)

我怀疑有些悬空线。

发生这种情况时,请在调试器中暂停该过程并查看仍然存在的线程。

答案 2 :(得分:0)

可以尝试使用它的count和Item属性手动迭代列表,而不是使用它的迭代器,有些事情如下:

for (int i=1; i <= lst.Count ; ++i)
{
 string projectName = lst.Item(i);
}

它可能是Iterator使它保持活动而不是列表对象本身,如果不使用迭代器可能没有问题。

答案 3 :(得分:0)

尝试将这两行添加到构建后事件:

call "$(DevEnvDir)..\Tools\vsvars32.bat"
editbin.exe /NXCOMPAT:NO "$(TargetPath)"