【问题标题】:Visual Studio project remains "stuck" when stoppedVisual Studio 项目在停止时仍然“卡住”
【发布时间】:2011-02-15 13:08:27
【问题描述】:

目前正在为惠普质量中心开发一个连接器 DLL。我正在使用他们的(插入说明性的)COM API 连接到服务器。 VStudio 会自动创建一个 Interop 包装器。

我的解决方案有 2 个项目: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. 一直单步执行测试功能应用程序,当窗体关闭且 Main 功能结束时 - 它关闭,但 VStudio 仍显示我正在运行。

感谢您的帮助!

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 好建议。会尝试报告。
【解决方案3】:

我怀疑有些悬空线程。

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

【讨论】:

  • 试过了 - 有一些线程,但不是主要线程。您建议我如何进行?
  • 我不是线程专家。据我所知,这可能是几件事。最好是使用调试器四处寻找,看看谁创建/拥有线程。
【解决方案4】:

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

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

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

【讨论】:

  • 感谢您的提议 - 这是我尝试的第一件事。没用。
猜你喜欢
  • 2014-08-23
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 1970-01-01
  • 2018-12-05
  • 2012-06-29
相关资源
最近更新 更多